2016-07-29 84 views
0

我試圖確定.csv文件的每一列中包含的數據的類型,以便我可以爲MySQL創建CREATE TABLE語句。該程序將列出所有列標題,然後獲取第一行數據並確定每種數據類型並將其附加到列標題以獲取正確的語法。例如:查找沒有空字符串的行

ID Number Decimal Word 
0 17  4.8  Joe 

這會產生類似CREATE TABLE table_name (ID int, Number int, Decimal float, Word varchar());的東西。

問題是,在某些.csv文件中,第一行包含一個NULL值,該值作爲空字符串讀取並混淆該過程。我的目標是搜索每一行,直到找到一個不包含NULL的值,並在形成語句時使用該值。這是我迄今所做的,只是它有時仍然會返回行包含空字符串:

def notNull(p): # where p is a .csv file that has been read in another function 
    tempCol = next(p) 
    tempRow = next(p) 
    col = tempCol[:-1] 
    row = tempRow[:-1] 
    if any('' in row for row in p): 
     tempRow = next(p) 
     row = tempRow[:-1] 
    else: 
     rowNN = row 
    return rowNN 

注:.csv文件讀取是在不同的函數中完成,而這個功能只需使用已讀.csv文件作爲輸入p。此外,每行以,結尾,將其視爲一個額外的空字符串,因此在檢查每行的最後一個值之前,先檢查它是否爲空字符串。

問題:我創建的函數有什麼問題導致它不總是返回沒有空字符串的行?我覺得這是因爲循環沒有必要重複,但我不太清楚如何解決這個問題。

+0

你能否說明p的類型是什麼?它是一串字符串列表嗎? –

+0

我在_Note_下面提到了它的功能。 'p'是另一個函數讀取的'.csv'文件。 – ThoseKind

回答

2

我無法真正解讀你的代碼。這是我會做的只有沒有空字符串的行。

import csv 

def g(name): 
    with open('file.csv', 'r') as f: 
     r = csv.reader(f) 
     # Skip headers 
     row = next(r) 

     for row in r: 
      if '' not in row: 
       yield row 

for row in g('file.csv'): 
    print('row without empty values: {}'.format(row)) 
+0

對不起,它不是很容易破譯,因爲它是一個大得多的程序的一小部分,最終會太多粘貼和解釋。然而,你的回答幫助我得到了我想要的東西。謝謝! – ThoseKind