从 CSV 文件中删除换行符

6

我正在尝试在Python中处理一个包含^M字符的csv文件,这些字符在每一行/行中都是换行符。除'rU'模式外,我无法以任何其他模式打开该文件。

如果我以“rU”模式打开文件,它会读取换行符并拆分文件(创建新行),从而使我拥有两倍数量的行。

我希望完全删除换行符。怎么办?


1
dos2unix 是你想要的。 - squiguy
1个回答

18

请注意,正如文档所说:

csvfile可以是任何支持迭代器协议的对象,每次调用其next()方法时返回一个字符串-文件对象和列表对象都适用。

因此,在将其交给readerDictReader之前,您总是可以在文件上放一个过滤器。 相比之下:

with open('myfile.csv', 'rU') as myfile:
    for row in csv.reader(myfile):

这样做:

with open('myfile.csv', 'rU') as myfile:
    filtered = (line.replace('\r', '') for line in myfile)
    for row in csv.reader(filtered):

'\r'是Python(和C)中表示^M的方式。因此,这只是通过用空字符串替换每个^M字符来删除它们出现的任何位置上的所有^M字符。


我想永久修改文件,而不是过滤它。

首先,如果您想在运行Python脚本之前修改文件,为什么不在Python之外进行修改?sedtr、许多文本编辑器等都可以为您完成此操作。这里有一个GNU sed示例:

gsed -i'' 's/\r//g' myfile.csv

但如果你想用Python做这件事,它并不会更冗长,而且你可能会发现它更易读,所以:

首先,如果你想在文件中插入或删除内容,并不能真正地就地修改文件。通常的解决方案是编写一个新文件,然后将新文件移动到旧文件上(仅限Unix),或者删除旧文件(跨平台)。

跨平台版本:

os.rename('myfile.csv', 'myfile.csv.bak')
with open('myfile.csv.bak', 'rU') as infile, open('myfile.csv', 'wU') as outfile:
    for line in infile:
        outfile.write(line.replace('\r'))
os.remove('myfile.csv.bak')

更为简洁但仅适用于Unix系统的版本:

temp = tempfile.NamedTemporaryFile(delete=False)
with open('myfile.csv', 'rU') as myfile, closing(temp):
    for line in myfile:
        temp.write(line.replace('\r'))
os.rename(tempfile.name, 'myfile.csv')

我猜我想要永久修改文件,而不是过滤它。你的代码进行了过滤,但是否有一种方法,例如打开文件并仅删除^M并关闭它,从而永久修改它?例如,在上面的例子中,一旦我打印行,我确实看到了换行符。不确定我遗漏了什么。我的意思是,我总是可以在rU中打开文件,并创建一个新文件,并将行追加到其中,从而为原始文件的2行创建1行。非常感谢。 - ganesh reddy
@dqr:我不确定我理解你的后续问题,但我会尝试更新答案。 - abarnert
@abarnert:当我运行您的解决方案的Python版本时,我会收到以下错误:ValueError: universal newline mode can only be used with modes starting with 'r'。您知道为什么吗? - creggnog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接