0

私には2つのパスがあります

path1 = "/home/x/nearline"
path2 = "/home/x/sge_jobs_output"

path1 には、一連の fastq ファイルがあります。

ERR001268_1.recal.fastq.gz
ERR001268_2.recal.fastq.gz
ERR001269_1.recal.fastq.gz
ERR001269_2.recal.fastq.gz
.............

path2 には、path1 の fastq ファイルに対応する多くの .txt があります。

ERR001268_1.txt
ERR001268_2.txt
ERR001269_1.txt
ERR001269_2.txt
.............

これで、path1 の fastq ファイルから fastq_seq_num を計算するスクリプトを作成しました。以下を参照してください。

for file in os.listdir(path1):
  if re.match('.*\.recal.fastq.gz', file):
    fullpath1 = os.path.join(path1, file)
#To calculate the sequence number in fastq.gz files  
    result = commands.getoutput('zcat ' + fullpath1 + ' |wc -l')
    fastq_seq_num = int(result)/4.0
  print file,fastq_seq_num 

また、path2 の .txt ファイルから num_seq_processed_sai を計算します。以下を参照してください。

for file in os.listdir(path2):
  if re.match('.*\.txt', file):
      fullpath2 = os.path.join(path2, file)
#To calculate how many sequences have been processed in .sai file
      linelist = open (fullpath2,'r').readlines
      lastline = linelist[len(linelist)-1]
      num_seq_processed_sai = lastline.split(']')[1].split()[0]
  print file,num_seq_processed_sai

さて、私の問題は次のとおりです。パス1の最初のfastqファイルのfastq_seq_numを計算するループを作成したいです。次に、path2 の FIRST txt ファイルの num_seq_processed を計算します。次に、この 2 つの数値を比較します。その後、ループを終了します。次に、2 番目のループが開始されます...これを実現するためにループを設計するにはどうすればよいですか? ありがとう!!!

4

2 に答える 2

2

両方のディレクトリのファイル数が同じであることが保証されていますか? その場合は、zip関数を使用してこれを実現できます。

for fastqFile, txtFile in zip(glob.glob(path1+'/*.recal.fastq.gz'), glob.glob(path2+'/*.txt')):
    result = commands.getoutput('zcat ' + fastqFile + ' |wc -l')
    fastq_seq_num = int(result)/4.0

    lastline = linelist[-1]
    num_seq_processed_sai = lastline.split(']')[1].split()[0]


    print fastqFile, fastq_seq_num 
    print txtFile, num_seq_processed_sai

EDIT:サイドノートとしてglob.glob()、出力を手動でフィルタリングするよりも使用する方がほとんどの場合望ましいですos.listdir()。単語fileはPythonの組み込み型であるため、変数名として使用しないでください。さらに、 の最後の項目に到達するには、listでアクセスするだけですlistName[-1]。でアクセスするのlistName[len(listName)-1]は非Pythonicです。

于 2011-06-26T23:42:29.367 に答える
2

fastq ファイルを繰り返し、対応する .txt ファイルを確認し、ペアが存在する場合は、処理を実行して出力を比較します

import commands
import glob
from os import path

dir1 = '/home/x/nearline'
dir2 = '/home/x/sge_jobs_output'

for filepath in glob.glob(path.join(dir1, '*.recal.fastq.gz')):
    filename = path.basename(filepath)
    job_id = filename.split('.', 1)[0]

    ## Look for corresponding .txt file
    txt_filepath = path.join(dir2, '%s.txt' % job_id)
    ## Fail early if corresponding .txt file is missing
    if not path.isfile(txt_filepath):
        print('Missing %s for %s' % (txt_filepath, filepath))
        continue

    ## Both exist, process each
    ## This is from your code snippet
    result = commands.getoutput('zcat ' + fullpath1 + ' |wc -l')
    fastq_seq_num = int(result)/4.0

    linelist = open(txt_filepath).readlines()
    lastline = linelist[len(linelist)-1]
    num_seq_processed_sai = lastline.split(']')[1].split()[0]

    if fastq_seq_num == num_seq_processed_sai:
        print "Sequence numbers match (%d : %d)" % (fastq_seq_num, num_seq_processed_sai)
    else:
        print "Sequence numbers do not match (%d : %d)" % (fastq_seq_num, num_seq_processed_sai)

ファイルの一覧表示に使用することをお勧めしglob.glob()ます (このスニペットで行ったように)。

に置き換えることもお勧めcommandssubprocessます。これは新しく、コマンドは非推奨だと思います。

また、.txt ファイルのすべての行を読み取って最後の行を取得するのは非効率的であり、ファイルが大きい場合はメモリの問題が発生する可能性があります。最後の行を取得するために呼び出すことを検討してくださいtail(* nix のみだと思います)。

于 2011-06-26T23:51:10.787 に答える