2014-09-19 75 views
0

此代码从stackoverflow上的其他位置借用,将删除csv中写入“None”的所有位置。但是,它也增加了一个额外的行csv。如何更改此代码以删除多余的行?我认为问题是由inplace引起的,但是当我将inplace带走时,通过运行代码不再更改该文件。使用Python从csv中删除行也会添加额外的行

def cleanOutputFile(filename): 
    for line in fileinput.FileInput(filename,inplace=1): 
     line = line.replace('None',"") 
     print line 

谢谢!

+0

我会猜测额外的换行符来自'print'吗? – balu 2014-09-19 18:27:17

+0

我不建议修改文件。尝试写入新文件。 – b10n 2014-09-19 18:27:26

+0

这很奇怪,因为我不希望这些代码会改变文件。 'line = line.replace(...)'实际上不应该修改文件,当然也不会'打印'。你的“无”真的被删除? – Kevin 2014-09-19 18:27:46

回答

3

如果要更换所有的None's

with open(filename) as f: 
    lines = f.read().replace("None","") 
with open(filename,"w") as f1: 
    f1.write(lines) 

使用rstripfileinput也应努力:

import fileinput 
for line in fileinput.FileInput(fileinput,inplace=1): 
     print line.replace('None',"").rstrip() # remove newline character to avoid adding extra lines in the output 
+0

这只会将最后一行写入文件。 – 2014-09-19 18:35:03

+0

@BurhanKhalid,那究竟是怎么回事? – 2014-09-19 18:35:32

+0

因为每次用'w'打开一个文件,它都会被截断。 – 2014-09-19 18:36:40

3

这里的问题无关与fileinput,或与replace

从文件读取的行总是以换行符结束。

print添加换行符,即使您打印的东西已经以换行符结束。

你可以看到,甚至没有涉及到的文件:

>>> a = 'abc' 
>>> print a 
abc 
>>> a = 'abc\n' 
>>> print a 
abc 

>>> 

的解决方案是以下任一:关闭输入

  • rstrip新行:print line.rstrip('\n')(或做条早些时候在你的处理)
  • 使用“魔法逗号”来防止print添加新行:print line,
  • 使用Python 3风格printfrom __future__ import print_function,这样你就可以使用更灵活的关键字参数:print(line, end='')
  • 使用sys.stdout.write而不是print
  • 彻底重新组织你的代码,这样你不再写入标准输出的,而是直接写入到一个临时文件,或者读取整个文件到内存中,然后写回了,等