Python 3读取行中有换行符的CSV文件
我有一个大的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个。任何关于如何忽略第二行换行符的建议?
您描述的文件不是CSV(逗号分隔值)文件。 CSV文件是记录列表每行一个其中每条记录都用逗号分隔。 CSV的各种“风格”支持用于引用字段的各种功能(例如,字段中嵌入了逗号)。
我认为最好的方法是创建一个适配器类/实例,它会预先处理的原始文件,发现并合并连续行为记录并传递给那些你csv.reader的实例。您可以在来自Python标准库的StringIO之后为您的班级建模。
重点在于您创建了一些处理数据但行为足够像文件对象的东西,它可以透明地用作类似csv.reader()之类的输入源。
(如果处理得当,你甚至可以实现Python context manager protocol。io.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)。你的适配器类可以做你喜欢的任何事情。
您可以定义一个正则表达式模式来帮助您迭代行。
阅读整个文件内容 - 如果可能的话。
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。尝试使用Microsoft Excel或Google表格等编辑器。他们会正确输出CSV,并将包含特殊字符的单元格用引号括起来。请参阅https://*.com/questions/566052/ – andrewgu
是行分隔符字面上的行#?你怎么知道什么时候某个东西不是'新'行 – EoinS
剥离该行并在创建文件之前检查它是否等于空字符串。 像这样:'''content = row.strip()''' – arsho