О петлевом цикле - PullRequest
       20

О петлевом цикле

0 голосов
/ 27 июня 2011

у меня два пути

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 у меня много .txt, соответствующих файлам fastq в path1:

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

НЕТ. Я создал скрипт для расчета fastq_seq_num из файлов fastq в path1, см. Ниже:

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 

А также рассчитать num_seq_processed_sai из файлов .txt в path2, см. Ниже:

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

ОК, теперь моя проблема: я хочу создать цикл, в котором я вычисляю fastq_seq_num для FIRST-файла fastq в path1; затем вычислите num_seq_processed для первого текстового файла в path2; затем сравните эти два числа; затем закончите цикл. Затем начинается второй цикл ... Как я могу создать какой-то цикл для достижения этой цели? спасибо !!!

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Выполните итерацию файлов 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() для вывода списка файлов (как ясделано в этом фрагменте).

Я также предлагаю заменить commands на subprocess, это новее, и я думаю, что команды устарели.

Кроме того, чтениевсе строки файла .txt, которые нужно получить в последней строке, неэффективны и могут вызвать проблемы с памятью, если файлы имеют большой размер.Попробуйте набрать tail, чтобы получить последнюю строку (думаю, * nix).

2 голосов
/ 27 июня 2011

Количество файлов в обоих каталогах одинаково?Если это так, вы можете использовать функцию 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

РЕДАКТИРОВАТЬ: В качестве примечаний, использование glob.glob() почти всегда предпочтительнее, чем ручная фильтрация вывода os.listdir() и словаfile - это встроенный тип в Python, который никогда не следует использовать в качестве имени переменной.Кроме того, чтобы перейти к последнему элементу list, вам нужно получить к нему доступ только с listName[-1].Доступ к нему с помощью listName[len(listName)-1] не пифоничен.

...