2012-03-14 15 views
3

私は数日からのPythonの問題に直面しています。私は基本的なプログラミングスキルのないバイオインフォマティクスです。私は処理しなければならない巨大なテキストファイル(約25GB)を扱っています。巨大なテキストファイルの行を4のグループで読む

私はtxtファイルを1行につき4行ずつ読み込む必要があります。つまり、最初の4行を読み込んで処理してから、2行目の4行を読み込む必要があります。そうです。

明らかに私はメモリを過負荷にするので、私はreadlines()演算子を使うことができません。文字列認識のためには4行のそれぞれを使わなければなりません。

私は範囲オペレータとののサイクルを使用して考えた:残念ながら、これはpossibile "読み" モードであるため、ファイルではありません

openfile = open(path, 'r')

for elem in range(0, len(openfile), 4):

line1 = readline() 
line2 = readline() 
line3 = readline() 
line4 = readline() 
(process lines...) 

リストや辞書のように反復処理することはできません。

誰でもこのサイクルを正しく行うことができますか?事前

+0

は読み込みのために開かれやすい行指向的に巡回できない - を参照してください'file.next()'のセクションを参照してください:http://docs.python.org/library/stdtypes.html?highlight=file.next#file.next – martineau

答えて

2

Python hereで大きなファイルを遅延読み込む方法があります。そのアプローチを使用して、一度に4行を処理することができます。 4回の読み取り操作を実行してから、4回の読み取り操作を繰り返し実行する必要はありません。ファイルから数百〜数千行のチャンクを読み込み、一度に4行を処理することができます。これらの行が終わったら、ファイルの内容を読むことができます。

+0

あなたが言うほとんどすべてが真ですが、複数行になりますアルゴリズムのチャンク指向バージョンは、基本的なプログラミング技能を持たない人にとっては特に簡単に言えます。 – martineau

1

ありがとうございます無限ループを使用して、あなたは、ファイルの終わりに達すると、それから抜け出すことができました。

while True: 
    line1 = f.readline() 
    if not line1: 
     break 

    line2 = f.readline() 
    line3 = f.readline() 
    line4 = f.readline() 
    # process lines 
5

これはメモリオーバーヘッドが少ないです。ファイルが行ごとに読み込まれるイテレータであるという事実を考慮します。

def grouped(iterator, size): 
    yield tuple(next(iterator) for _ in range(size)) 

このようにそれを使用します。

for line1, line2, line3, line4 in grouped(your_open_file, size=4): 
    do_stuff_with_lines() 

注:このコードファイルには、部分的にグループで終わっていないことを前提としています。

3

あなたはfastqファイルを読んでいますか?あなたはおそらくホイールを再発明しているでしょう - Biopythonを使うだけでよく、一般的な生物学ファイル形式を扱うためのツールがあります。例えばFASTQファイルで何かを行うため、this tutorialを参照してください - それはこのように、基本的になります。biopython SeqRecord上

from Bio import SeqIO 
for record in SeqIO.parse("SRR020192.fastq", "fastq"): 
    # do something with record, using record.seq, record.id etc 

もっとhereオブジェクト。

from Bio.SeqIO.QualityIO import FastqGeneralIterator 
for title, seq, qual in FastqGeneralIterator(open("untrimmed.fastq")): 
    # do things with title,seq,qual values 

HTSeq packageは、よりディープシークエンシング固有のツールでもあります:

Hereはこのように、低レベルのライブラリを使用してより速くこれを行うための変種を含む別のbiopython FASTQ処理のチュートリアルであり、私は実際にもっと頻繁に使用します。

ちなみに、Biostarについてはまだ分かりませんが、これは具体的にはバイオインフォマティクス向けのStackExchange形式のサイトです。ここで

0

は私が信用を取ることができない、それを行う方法ですが、非常に合理的です:Pythonのファイルで

for name, seq, comment, qual in itertools.izip_longest(*[openfile]*4): 
    print name 
    print seq 
    print comment 
    print qual