2017-05-29 8 views
1

私は入力のような大きなファイルを持っていて、各行は@で始まる行と同じIDに対応しています。 2行目(@の後)は一連の文字であり、IDの中にはこの行がありません。この場合、私はすべての4行を削除したいと思います同じIDに属しています。
私はPythonで以下のコードを試してエラーを出しました。テキストファイル編集時のエラー

入力:

@M00872:361:000000000-D2GK2:1:1101:16003:1351 1:N:0:1 
ATCCGGCTCGGAGGA 
+ 
1AA?ADDDADDAGGG 
@M00872:361:000000000-D2GK2:1:1101:15326:1352 1:N:0:1 
GCGCAGCGGAAGCGTGCTGGG 
+ 
CCCCBCDCCCCCGGEGGGGGG 
@M00872:361:000000000-D2GK2:1:1101:16217:1352 1:N:0:1 

+ 

出力:

@M00872:361:000000000-D2GK2:1:1101:16003:1351 1:N:0:1 
ATCCGGCTCGGAGGA 
+ 
1AA?ADDDADDAGGG 
@M00872:361:000000000-D2GK2:1:1101:15326:1352 1:N:0:1 
GCGCAGCGGAAGCGTGCTGGG 
+ 
CCCCBCDCCCCCGGEGGGGGG 


import fileinput 

with fileinput.input(files="4415_pool.fastq", inplace=True, backup="file.bak") as f: 
    for l in f: 
     if l.strip().startswith("@"): 
      c = 2 
      next_line = f.readline().strip() 
      if not next_line: 
       while c:   
        c -= 1 
        try: 
         next(f) 
        except StopIteration: 
         break 
      else: 
       print(l.strip()) 
       print(next_line.strip()) 
       while c: 
        c -= 1 
        try: 
         print(next(f).strip()) 
        except StopIteration: 
         break 

が、仕事と、このエラーを与えませんでした:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: FileInput instance has no attribute '__exit__' 

あなたがこの問題を解決する方法を知っていますか?

+1

どのpythonバージョンを使用していますか?私はそれがとfileinputをサポートしていない古いバージョンだと思う。 'f = fileinput.input(files =" 4415_pool_TCP_Ctrl.fastq "、inplace = True、backup =" file.bak ")' –

+0

のpythonのバージョンは2.7です。 – ARM

答えて

2

with fileinput.input()..ステートメントで使用する場合は、fileinput.FileInputクラスには__exit__()メソッドが実装されていないようですが、このメソッドは実装されていません。

1

は、私はこの問題は、文は、Iドン2.5で追加されたとがwith

に使用する代わりに

f = fileinput.input(files="4415_pool.fastq", inplace=True, backup="file.bak") 

with fileinput.input(files="4415_pool.fastq", inplace=True, backup="file.bak") as f 
1

をFileInputクラスをサポートしていませPythonのバージョン(2.7)だと思いますfileinputがそれを使うために移植されたと思います(contextlib?)。

あなたのコードはpython3では動作しますが、2.7では動作しません。以下のような行を反復するか使用PY3またはポート、コード、問題を修正するには:私は

# Read all the lines in a buffer 
with open('input.fastq', 'r') as source: 
    source_buff = iter(source.readlines()) 

with open('output.fastq', 'w') as out_file: 
    for line in source_buff: 
    if line.strip().startswith('@'): 
     prev_line = line 
     line = next(source_buff) 

     if line.strip(): 
     # if the 2nd line is not empty write the whole block in the output file 
     out_file.write(prev_line) 
     out_file.write(line) 
     out_file.write(next(source_buff)) 
     out_file.write(next(source_buff)) 
     else: 
     pass 

:(2.7)あなたの質問に対する解決策として

with open(filename, "r") as f: 
     lines = f.readlines() 

    for line in lines: 
     #do whatever you need to do for each line. 
0

私のような何かをするだろう.fastqファイルが非常に大きいことがあるので、バッファ内のファイル全体を読むのではなく、毎回4行(またはあなたのブロックと同じ数の行)を読むループにこのコードを入れることをお勧めします。

関連する問題