Python 3读取CSV文件,行中有换行符

7 人关注

我有一个大的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)
    for row in lines:
        content= row
        outFile= open("output"+str(i)+".txt", 'w')
        outFile.write(content)
        outFile.close()

这是在为每一行创建4个文件,而不是3个。对于如何忽略第二行的换行,有什么建议吗?

5 个评论
那个源CSV似乎没有正确的CSV格式。试着使用像Microsoft Excel或Google Sheets这样的编辑器。它们会正确地输出CSV,包含特殊字符的单元格用引号包裹。见 stackoverflow.com/questions/566052
你怎么能知道什么东西不是 "新 "行呢?
剥离行并在创建文件前检查它是否等于空字符串。像这样。【替换代码0
在这里仍能正常工作。 python 3.4 windows。对不起,无法重现。也许是不可见字符的问题。你能用十六进制编辑器编辑该文件吗?你能不能用你发布的输入文件(在一个新文件中)试试,以说服你自己,你的原始输入文件有问题。因为它工作得很好,正如我所说
macintosh有一种奇怪的方式来终止行。在你的简单文件和大文件之间检查十六进制编辑器。在你的大文件中创建一些小的摘要。检查各行是否以0D或0D 0A或0A结束......我只能提供这些帮助,抱歉。
python
csv
Labibah
Labibah
发布于 2017-09-06
2 个回答
wwii
wwii
发布于 2017-09-06
已采纳
0 人赞同

你可以定义一个正则表达式模式来帮助你遍历 rows .

读取整个文件内容 - 如果可能的话。

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"
******
    
Jim Dennis
Jim Dennis
发布于 2017-09-06
0 人赞同

你所描述的文件不是一个CSV(逗号分隔值)文件。 CSV文件是一个记录的列表 one per line 其中每条记录都用逗号隔开。 CSV有不同的 "口味",支持不同的引号功能(例如,在字段中嵌入逗号的情况下)。

我认为你最好的选择是创建一个适配器类/实例,它可以预处理原始文件,找到并将续行合并为记录,然后将这些记录传递给你的实例 csv.阅读器 . 你可以按照以下方式模拟你的班级 StringIO 来自Python标准库。

重点是,你创建了一个处理数据的东西,但它的行为足够像一个文件对象,以至于它可以透明地被用作类似以下东西的输入源 csv.阅读器() .

(做得好的话,你甚至可以实现 Python上下文管理协议 . io.StringIO 确实支持这个协议,可以作为一个参考。 这将允许你在Python中使用这个假想的 "行合并 "适配器类的实例。 with 就像你在做你的公开声明一样。 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='"')