2014-09-19 40 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
  • 徹底重新組織你的代碼,這樣你不再寫入標準輸出的,而是直接寫入到一個臨時文件,或者讀取整個文件到內存中,然後寫回了,等