2012-05-29 744 views
3

我有一個包含值爲2000,00的文件。刪除文件中的空格和空行使用Python

但它包含2000,00後的空格和空行。

我想刪除所有的空格和空行,如果有人能夠給出一些想法,我已經嘗試了很多方法,但沒有成功。

一種方法我累是如下

# Read lines as a list 
fh = open("transfer-out/" + file, "r") 
lines = fh.readlines() 
fh.close() 
# Weed out blank lines with filter 
lines = filter(lambda x: not x.isspace(), lines) 
# Write "transfer-out/"+file+".txt", "w" 
fh = open("transfer-out/"+file, "w") 
#fh.write("".join(lines)) 
# should also work instead of joining the list: 
fh.writelines(lines) 
fh.close() 
+1

沒有的Python:'貓input.txt中| egrep -v'^ \ s * $'> output.txt' – eumiro

+1

這會留下數字後的空格。也許增加一個'tr':'cat input.txt | egrep -v'^ \ s * $'| tr -d''> output.txt' –

回答

5

strip()移除的前緣和後空格字符。

with open("transfer-out/" + file, "r") as f: 
    for line in f: 
     cleanedLine = line.strip() 
     if cleanedLine: # is not empty 
      print(cleanedLine) 

然後,您可以將腳本重定向到文件python clean_number.py > file.txt,例如。

+0

分解那些重複的「strip()」調用,並且您將獲勝。 :-) – NPE

+0

是的,先生!更新。 –

+0

@ Jill-Jênnie這個「轉出/」命令是什麼意思? – Lucas

1

,你想這應該工作:

file(filename_out, "w").write(file(filename_in).read().strip()) 

編輯:雖然前面的代碼在Python 2.x的工作,這是行不通的巨蟒-3(見@gnibbler評論)對於這兩個版本中使用這樣的:

open(filename_out, "w").write(open(filename_in).read().strip()) 
+0

我認爲你的意思是'打開''不'文件'在這裏。 –

+0

不,我的意思是文件。我更喜歡文件,但根據文檔(http://docs.python.org/library/functions.html?highlight=file#file)打開是prefferable :-( – Jiri

+0

@BurhanKhalid,'文件'是一個不贊同的' open',它存在於Python2中,因爲'open'是一個奇怪的名字,用於子類化'file'或者與'isinstance'一起使用,它不再存在於Python3中 –

2

另外一個與列表理解:

clean_lines = [] 
with open("transfer-out/" + file, "r") as f: 
    lines = f.readlines() 
    clean_lines = [l.strip() for l in lines if l.strip()] 

with open("transfer-out/"+file, "w") as f: 
    f.writelines('\n'.join(clean_lines)) 
+0

你應該添加一個連接:'f.writelines('\ n'.join(clean_lines))''。 –

+0

@ Jill-JênVieVie謝謝! –

1

改變你的'線'線來使用下面的發電機,它應該做的伎倆。

lines = (line.strip() for line in fh.readlines() if len(line.strip())) 
+0

'如果len(line.strip())'可以替換爲'if line.strip()' – eumiro

+0

是的,很好的調用。 –

0

功能的:)

import string 
from itertools import ifilter, imap 

print '\n'.join(ifilter(None, imap(string.strip, open('data.txt')))) 
# for big files use manual loop over lines instead of join 

用法:

$ yes "2000,00 " | head -n 100000 > data.txt 
$ python -c "print '\n'*100000" >> data.txt 
$ wc -l data.txt 
200001 data.txt 
$ python filt.py > output.txt 
$ wc -l output.txt 
100000 output.txt 
+0

對不起,我很愚蠢的閱讀你的代碼!我必須從文件夾訪問我的文件並從中刪除空格和空行! – Sara

+0

而且還有一件事情把數據寫回同一個文件 – Sara