2016-08-09 37 views
2

我有一個文本文件(a.txt)。這裏的一個小部分:篩選出一些行

ENSG00000060642.6 0,023999998 0,015999999 0,666666667 0,006410256 0,006410256 1,000000073 0,016393442 0,016393442 1 0,020202022 0,030303031 1,499999908 
ENSG00000149136.3 0,03508772 0,01754386 0,5 0,068627447 0,029411765 0,428571456 0,078947365 0,065789476 0,833333396 0,066666663 0,066666663 1 
ENSG00000104889.4 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 
ENSG00000157827.15 0,055555556 0,037037037 0,666666667 0,032258064 0,048387095 1,5 0,150000006 0,024999999 0,16666665 0,222222224 0,037037037 0,166666667 
ENSG00000146067.11 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 
ENSG00000167700.4 0,299999982 0 0 0,071428567 0,071428567 1 0 0 #DIV/0! 0 0 #DIV/0! 
ENSG00000172137.14 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 1 0 0 
ENSG00000178776.4 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 0 0 #DIV/0! 

我想篩選出所有線路包括,哪怕只有一個,並作出新的文本文件「#DIV/0!」「#DIV/0!」 。

+1

是的,我們做的。你有什麼嘗試? – Julien

+0

作爲一個方面說明,你可能不一定需要python。如果你在* nix機器上,你可以使用'grep'。如果你有最初的excel,你可以使用它來產生一個乾淨的文件。 –

回答

1

你可以這種方式是漸進做到這一點(所以它不會將整個文件讀入內存中一次):

from itertools import ifilter 

with open('a.txt', 'r') as inf, open('new.txt', 'w') as outf: 
    outf.writelines(ifilter(lambda line: '#DIV/0!' not in line, inf)) 
+0

嗨馬蒂諾,那太好了。昨天我試圖使用ifilter,但沒有工作。現在我知道問題是什麼。 – user3925736

+0

@martineau,你能解釋一下爲什麼ifilter在這種情況下比一個簡單的'list comprehension'更強大嗎? 例如 'outf.writelines([如果'#DIV/0!'不在行]中的行中的行)' 我被告知,列表推理比Python更麻煩,但我相信你有你的原因。 –

+1

@Max:列表解析絕對是Pythonic,但並不奇怪,它們創建一個列表,它要求所有元素同時在內存中 - 這通常很好。但是,如果可能有很多這樣的項目和/或沒有理由讓它們保留,那麼Pythonic也可以迭代地處理它們,一次一個項目,使用最少量的資源。據我所知,就是這種情況。 – martineau

0
for line in open('a.txt').read().splitlines(): 
    if '#DIV/0!' not in line: 
     print(line) 
+3

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。我們在這裏努力成爲知識的資源。 –

0
new_file = open('output.txt' , 'w') 
for line in open('a.txt').read().splitlines(): 
    if '#DIV/0!' not in line: 
      new_file.write(line) 
new_file.close() 
1
with open('a.txt') as f, open('b.txt', 'w') as new_file: 
    new_file.writelines([line for line in f if '#DIV/0!' not in line]) 

編輯:

這種方法可能是最快的。但是,正如前面用@martineau所討論的那樣,根據文件的大小,這不可能是最好的答案。

  • list comprehension[line for line in f if '#DIV/0!' not in
    line]
    是在python很常見的,它取代了一段代碼:

    l = [] 
    for line in f: 
        if '#DIV/0!' not in line: 
         l.append(line) 
    

但它更優化(見此處的說明:Efficiency of list comprehensions

list comprehension加載內存中的所有內容,因此在大量數據的情況下, 會導致緩衝區溢出。

這就是爲什麼在這裏,當你不確定你會處理多少數據時,使用增量方法(@ martineau's)更安全!

  • with語句替換try和catch。它也 塊後自動關閉文件。正如你可以看到,它也可以嵌套:你可以用一個 with聲明打開幾個文件。
+0

一個簡短的描述將會與新手有很長的路要走。 –

+0

完成!我修好了我的懶惰 –