2013-01-17 276 views
4

我想在每行/行的中间有^ M字符的python中,它是一个换行符的csv文件。我无法以'rU'以外的任何模式打开文件。从csv文件中删除换行

如果我在'rU'模式下打开文件,它会读入换行符并分割文件(创建一个换行符)并给出两倍的行数。

我想完全删除换行符。怎么样?

+1

'dos2unix'是你想要的。 – squiguy

回答

11

需要注意的是,为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.

所以,你可以随时递给你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'是拼写^M的Python的(和C)的方式。所以,这只是将所有^M个字符都去掉,无论它们出现在哪里,都用空字符串替换每个字符。


I guess I want to modify the file permanently as opposed to filtering it.

首先,如果你想在其上运行你的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') 
+1

生成器表达式的+1 –

+0

我想我想永久修改文件而不是过滤它。你的代码将它过滤掉,但是有没有办法打开这个文件,然后删除^ M并关闭它,从而永久修改它?例如在上面的例子中,一旦我打印行,我确实看到换行符。不知道我缺少什么。我的意思是我总是可以用rU打开文件并创建一个新文件并将行附加到它上面,在原始文件中为2行创建1行。非常感谢。 –

+0

@dqr:我不确定我了解你的后续行动,但我会尝试更新答案。 – abarnert