Сплит большие файлы .gz с префиксами - PullRequest
1 голос
/ 02 августа 2011

Каждый из моих файлов fastq составляет около 20 миллионов операций чтения (или 20 миллионов строк).Теперь мне нужно разбить большие файлы fastq на куски, каждый из которых имеет только 1 миллион операций чтения (или 1 миллион строк), для удобства дальнейшего анализа.Файл fastq похож на .txt.

Я думаю, просто посчитать строку и распечатать строки после подсчета каждые 1 миллион строк.Но входной файл - это сжатая форма .gz (fastq.gz). Нужно ли сначала разархивировать файл?

Как мне это сделать с помощью python?

Я попробовал следующую команду:

zless XXX.fastq.gz |split -l 4000000 prefix

(сначала gzip, а затем разделить файл)

Однако, похоже, он не работает с префиксом (я пробовал) "-prefix", но все равно не работает.Кроме того, с помощью команды split вывод выглядит так:

prefix-aa, prefix-ab...

Если мой префикс XXX.fastq.gz, то вывод будет XXX.fastq.gzab, что приведет к разрушению формата .fastq.gz.

Итак, что мне нужно, это XXX_aa.fastq.gz, XXX_ab.fastq.gz (т.е. суффикс).Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

... Мне нужно сначала распаковать его.

Нет, по крайней мере, не вручную.gzip позволит вам открыть сжатый файл, после чего вы считываете определенное количество байтов и записываете их в отдельный сжатый файл.См. Примеры в нижней части связанной документации, чтобы узнать, как читать и записывать сжатые файлы.

with gzip.open(infile, 'rb') as inp:
  for <some number of loops>:
    with gzip.open(outslice,'wb') as outp:
      outp.write(inp.read(slicesize))
  else: # only if you're not sure that you got the whole thing
    with gzip.open(outslice,'wb') as outp:
      outp.write(inp.read())

Обратите внимание, что сжатые gzip файлы не доступны в случайном порядке, поэтому вам потребуется выполнить операциюодин раз, если вы не хотите сначала распаковать исходный файл на диск.

1 голос
/ 10 июля 2014

Как опубликовано здесь

zcat XXX.fastq.gz | split -l 1000000 --additional-suffix=".fastq" --filter='gzip > $FILE.gz' - "XXX_"
0 голосов
/ 02 августа 2011

Вы можете прочитать сжатый файл как несжатый файл:

>>> import gzip
>>> for line in gzip.open('myfile.txt.gz', 'r'):
...   process(line)

Функция process() будет обрабатывать указанную вами логику подсчета строк и условной обработки.

...