2014-01-23 73 views
1

我使用unicodecsv來循環遍歷Python中csv文件的行。 我的CSV文件中的字符串在引號之間,但csv閱讀器仍然將換行符視爲行分隔符。用引號括起來的換行符的Python Unicode CSV

這是我的代碼:

with open(path, mode='rU') as f: 
    reader = unicodecsv.reader(f, delimiter=b',', quoting=csv.QUOTE_MINIMAL, quotechar=b'"', lineterminator="\n") 

    for count, row in enumerate(reader): 
     if count < row_offset: 
      continue 
     record = {} 
     for col, mapper in enumerate(mappers): 
      ... 
      ...            

下面是一個CSV行的一個示例:

"test","this line will 
continue on the next line","another column", 

出於某種原因,讀者將它讀作2行而不是一個。

編輯

新實例CSV行:

628,2012-07-27 01:59:32,000445,MARC,525,"HE547       ","1",2012-07-27,,,,,,,,"This is an example, this is a test line. 
new line but it is in the same csv line, followed by some enters! 


", 
+2

這是Python 3還是Python 2?你在這裏使用'b'''字符串。 –

+0

Python版本2.7.6 –

+0

你至少能告訴我們這兩行代碼返回的是* *嗎?隨意添加內容,但保留最初的空格並引用完整的字符。 –

回答

2

你有逗號後的空白;設置skipinitialspace=True對讀者忽略這一點:

reader = unicodecsv.reader(f, delimiter=b',', skipinitialspace=True, quoting=csv.QUOTE_MINIMAL, quotechar=b'"', lineterminator="\n") 

演示與常規reader.csv()對象:

>>> reader = csv.reader(f, delimiter=b',', quoting=csv.QUOTE_MINIMAL, quotechar=b'"') 
>>> next(reader) 
['test', ' "this line will'] 
>>> f.seek(0) 
>>> reader = csv.reader(f, skipinitialspace=True, delimiter=b',', quoting=csv.QUOTE_MINIMAL, quotechar=b'"') 
>>> next(reader) 
['test', 'this line will\ncontinue on the next line', 'another column', ''] 

注意如何沒有skipinitialspace標誌設置,第二列與' "...啓動,因此空間和報價。這並不是說換行符不被識別,但報價由於空間不被拾取。

另一種可能性是您的輸入數據使用不同的引用字符。無論哪種方式,csv.reader()不會識別您的列是引用。您需要查看不完整列的repr()以查看從閱讀器返回時包含哪些字符,以及該值中仍然存在什麼引號字符(如果有)。

但是,如果沒有準確的CSV樣本數據,很難說您在這裏遇到了什麼問題。

+0

它仍然是一樣的,我也刪除了問題中的空格。對不起,我的不好。 –

+0

@FrederikVoordeckers:你可以給一個帶有*真實*數據的粘貼的鏈接嗎?因爲我可以用那裏的空間完全重現問題。您需要提供一些沒有空格但仍會產生問題的測試數據。 –

+0

該數據不是公開的,因爲它包含機密信息,因此無法共享... –

相關問題