2011-07-29 217 views
12

我認爲這可能很簡單,但經過一個小時的搜索後,我一直沒有搞清楚我做錯了什麼。爲什麼Python CSV閱讀器忽略雙引號字段?

我正在使用下面的代碼來讀取CSV文件 - 我沒有讀取文件的問題,但是當一行包含一個雙引號的字段,因爲它包含分隔符時,CSV閱讀器會忽略雙擊引號,引號並將該字段解析爲2個單獨的字段。

下面是我使用的代碼:

myReader = csv.reader(open(inPath, 'r'), dialect='excel', delimiter=',', quotechar='"') 
for row in myReader: 
    print row, 
    print len(row) 

我輸入:

hello, this is row 1, foo1 
hello, this is row 2, foo2 
goodbye, "this, is row 3", foo3 

這給了我:

['hello', ' this is row 1', ' foo1'] 3 
['hello', ' this is row 2', ' foo2'] 3 
['goodbye', ' "this', ' is row 3"', ' foo3'] 4 

什麼我需要改變,因此它可以識別雙引號字段作爲一個字段? 我正在使用python版本2.6.1。

謝謝!

回答

22

如果你看一下,你正在使用的話,你會發現,Excel的方言 配置如下:

class excel(Dialect): 
    """Describe the usual properties of Excel-generated CSV files.""" 
    delimiter = ',' 
    quotechar = '"' 
    doublequote = True 
    skipinitialspace = False 
    lineterminator = '\r\n' 
    quoting = QUOTE_MINIMAL 

注意skipinitialspace設置爲False。只要把它傳遞給你的讀者。 哦,對了,你已經通過了所有的領域都已經當 使用excel方言,這是傳遞給csv.reader

所以默認方言參數的默認值,我將重新編寫代碼,像這樣:

>>> with open(inPath) as fp: 
>>>  reader = csv.reader(fp, skipinitialspace=True) 
>>>  for row in reader: 
>>>   print row, 
>>>   print len(row) 
['hello', 'this is row 1', 'foo1'] 3 
['hello', 'this is row 2', 'foo2'] 3 
['goodbye', 'this, is row 3', 'foo3'] 3 
4

這是因爲您的CSV引號前有空格:

one0, one1, one2 
two0, two1, two2 
tre0, "tr,e1", tre2 

VS

one0,one1,one2 
two0,two1,two2 
tre0,"tr,e1",tre2 

您需要先刪除這些多餘的空格。

+0

這是錯誤的:''csv.reader()''有'skipinitialspace'選項來處理這些空白。 – MERose

相關問題