我想在每行/行的中间有^ M字符的python中,它是一个换行符的csv文件。我无法以'rU'以外的任何模式打开文件。从csv文件中删除换行
如果我在'rU'模式下打开文件,它会读入换行符并分割文件(创建一个换行符)并给出两倍的行数。
我想完全删除换行符。怎么样?
我想在每行/行的中间有^ M字符的python中,它是一个换行符的csv文件。我无法以'rU'以外的任何模式打开文件。从csv文件中删除换行
如果我在'rU'模式下打开文件,它会读入换行符并分割文件(创建一个换行符)并给出两倍的行数。
我想完全删除换行符。怎么样?
需要注意的是,为the docs说:
csvfile can be any object which supports the iterator protocol and returns a string each time its
next()
method is called — file objects and list objects are both suitable.
所以,你可以随时递给你reader
或DictReader
之前贴在文件过滤器。取而代之的是:
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'
是拼写^M
的Python的(和C)的方式。所以,这只是将所有^M
个字符都去掉,无论它们出现在哪里,都用空字符串替换每个字符。
I guess I want to modify the file permanently as opposed to filtering it.
首先,如果你想在其上运行你的Python脚本之前修改文件,为什么不这样做,从Python的以外? sed
,tr
,许多文本编辑器等都可以为您做到这一点。这里有一个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')
生成器表达式的+1 –
我想我想永久修改文件而不是过滤它。你的代码将它过滤掉,但是有没有办法打开这个文件,然后删除^ M并关闭它,从而永久修改它?例如在上面的例子中,一旦我打印行,我确实看到换行符。不知道我缺少什么。我的意思是我总是可以用rU打开文件并创建一个新文件并将行附加到它上面,在原始文件中为2行创建1行。非常感谢。 –
@dqr:我不确定我了解你的后续行动,但我会尝试更新答案。 – abarnert
'dos2unix'是你想要的。 – squiguy