Python 3读取行文件中包含换行符的CSV文件

时间:2017-09-05 18:38:00

标签: python csv

我有一个大型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个文件。关于如何忽略第二行中的换行符的任何建议?

2 个答案:

答案 0 :(得分:1)

您可以定义正则表达式模式,以帮助您迭代

阅读整个文件内容 - 如果可能。

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

答案 1 :(得分:0)

您描述的文件不是CSV(逗号分隔值)文件。 CSV文件是每行一个的记录列表,其中每个记录用逗号分隔。 CSV有各种“风格”,支持引用字段的各种功能(例如,字段中嵌入了逗号)。

我认为您最好的选择是创建一个适配器类/实例,它将预处理原始文件,查找并将延续行合并到记录中,然后将它们传递给您的 csv.reader 。您可以在Python标准库的StringIO之后为您的类建模。

重点是你创建了一些处理数据但行为足够像文件对象的东西,它可以透明地用作 csv.reader()之类的输入源。

(正确完成,你甚至可以实现Python context manager protocolio.StringIO支持这个协议,可以作为参考。这将允许你使用这个假设的“行合并”适配器类的实例在Python with 语句中,就像在示例代码中使用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中)。你的适配器类可以做任何你喜欢的事情。