簡體   English   中英

Python 3 在行中讀取帶有換行符的 CSV 文件

[英]Python 3 reading CSV file with line breaks in rows

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

在 MAC Sierra 上使用 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 個。 關於如何忽略第二行中的換行符的任何建議?

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

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

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"
******
>>>

您描述的文件不是 CSV(逗號分隔值)文件。 CSV 文件是每行一個記錄的列表,其中每條記錄之間用逗號分隔。 CSV 有多種“風格”,它們支持引用字段的各種功能(例如,如果字段中嵌入了逗號)。

我認為你最好的選擇是創建一個適配器類/實例,它會預處理原始文件,找到並將延續行合並到記錄中,然后將它們傳遞給你的csv.reader實例。 您可以在 Python 標准庫中的StringIO之后為您的類建模

關鍵是您創建的東西可以處理數據,但其行為足夠像文件對象,可以透明地用作csv.reader() 之類的輸入源。

(如果操作得當,你甚至可以實現的Python上下文管理協議io.StringIO不支持此協議,可以作為一個參考。這將允許你在一個Python用“合並行”適配器類這種假設的情況下,剛剛聲明正如您在示例代碼中使用 open file()對象所做的那樣)。

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])

這只是在with語句中使用io.StringIO 的一個簡單示例。請注意, io.StringIO需要 Unicode 數據, io.BytesIO需要“字節”或字符串數​​據(至少在 2.7.x 中)。 你的適配器類可以做任何你喜歡的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM