我有一个大型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个文件。关于如何忽略第二行中的换行符的任何建议?
答案 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 protocol。io.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中)。你的适配器类可以做任何你喜欢的事情。