2017-09-05 302 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" 
****** 
>>>