2016-08-09 29 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!」「#1 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

こんにちはmartineau、それは素晴らしいです。昨日私はifilterを使用しようとしましたが、動作しませんでした。今私は問題が何だったか知っています。 – user3925736

+0

@martineau、なぜ 'ifilter'が単純な' list comprehension'よりも強力なのか、なぜ説明できますか? たとえば、 'outf.writelines(['DIV/0!'が行内にない場合、行内の行の行)' 'list comprehensions'よりももっとpythonicですと言われましたが、理由。 –

+1

@Max:リスト内包は間違いなくPythonであるが、驚くことではないが、すべての要素が同時にメモリに格納されているリストを作成する。しかし、もしそれらが潜在的にたくさんあり、それらを守る理由がなければ、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のもの)を使用するのは、処理するデータの数が不明な場合に安全です。

  • withステートメントはtryとcatchを置き換えます。また、 はブロックの後に自動的にファイルを閉じます。あなたは を見ることができるので、入れ子にすることもできます: withという文で1つのファイルを開くことができます。
+0

簡単な説明は初心者の方には大いに役立つでしょう。 –

+0

完了!私は怠惰を修正しました –

関連する問題