2017-09-05 347 views
0

我有一個大的CSV文件,其中一些行有一列並換行。我想讀取每個單元格的內容並將其寫入文本文件,但CSV閱讀器將具有換行符的單元格拆分爲多個單元格(多行),並將每個單元格寫入單獨的文本文件。Python 3讀取行中有換行符的CSV文件

在MAC塞拉利昂

這裏使用Python 3.6.2是一個例子:

"content of row 1" 
"content of row 2 
continues here" 
"content of row 3" 

這裏是我正在讀它:

with open(csvFileName, 'r') as csvfile: 

    lines= csv.reader(csvfile) 

    i=0 
    for row in lines: 
     i+=1 
     content= row 

     outFile= open("output"+str(i)+".txt", 'w') 

     outFile.write(content) 

     outFile.close() 

這是創建4個文件而不是每行3個。任何關於如何忽略第二行換行符的建議?

+2

該源CSV似乎並不正確格式化爲CSV。嘗試使用Microsoft Excel或Google表格等編輯器。他們會正確輸出CSV,並將包含特殊字符的單元格用引號括起來。請參閱https://stackoverflow.com/questions/566052/ – andrewgu

+2

是行分隔符字面上的行#?你怎麼知道什麼時候某個東西不是'新'行 – EoinS

+1

剝離該行並在創建文件之前檢查它是否等於空字符串。 像這樣:'''content = row.strip()''' – arsho

回答

0

您描述的文件不是CSV(逗號分隔值)文件。 CSV文件是記錄列表每行一個其中每條記錄都用逗號分隔。 CSV的各種「風格」支持用於引用字段的各種功能(例如,字段中嵌入了逗號)。

我認爲最好的方法是創建一個適配器類/實例,它會預先處理的原始文件,發現併合並連續行爲記錄並傳遞給那些你csv.reader的實例。您可以在來自Python標準庫的StringIO之後爲您的班級建模。

重點在於您創建了一些處理數據但行爲足夠像文件對象的東西,它可以透明地用作類似csv.reader()之類的輸入源。

(如果處理得當,你甚至可以實現Python context manager protocolio.StringIO不支持此協議,可以作爲一個參考。這將允許你在一個Python 使用「合流管線」適配器類這種假設的情況下,與聲明就像您在示例代碼中打開文件()對象一樣)。

from io import StringIO 
import csv 
data = u'1,"a,b",2\n2,ab,2.1\n' 
with StringIO(data) as infile: 
    reader = csv.reader(infile, quotechar='"') 
    for rec in reader: 
     print(rec[0], rec[2], rec[1]) 

這是在聲明注意io.StringIO需要Unicode數據使用io.StringIO的只是一個簡單的例子,io.BytesIO需要「字節」或字符串數​​據(至少在2.7.x)。你的適配器類可以做你喜歡的任何事情。

0

您可以定義一個正則表達式模式來幫助您迭代

閱讀整個文件內容 - 如果可能的話。

s = '''"content of row 1" 
"content of row 2 
continues here" 
"content of row 3"''' 

模式 - 雙引號,後面跟着不是雙引號的所有內容,然後是雙引號。:

row_pattern = '''"[^"]*"''' 
row = re.compile(row_pattern, flags = re.DOTALL | re.MULTILINE) 

迭代行:

for r in row.finditer(s): 
    print r.group() 
    print '******' 

>>> 
"content of row 1" 
****** 
"content of row 2 
continues here" 
****** 
"content of row 3" 
****** 
>>>