Использование fileinput.input () для чтения файлов gzip - PullRequest
2 голосов
/ 09 декабря 2011

Я использую fileinput для чтения больших данных:

import gzip
import fileinput
f=gzip.open('/scratch/try.fastq.gz','r')
for line in fileinput.input(f):
    print line

Однако я получил такие ошибки, как:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/share/lib/python2.6/fileinput.py", line 253, in next
    line = self.readline()
  File "/share/lib/python2.6/fileinput.py", line 345, in readline
    self._file = open(self._filename, self._mode)
IOError: [Errno 2] No such file or directory: '@HWI-ST150_0129:2:1:13466:2247#0/1\n'

Не может fileinput принять объект файла в качестве ввода? Тогда как использовать fileinput для работы с файлом gzip? ТНХ

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Нет, первый аргумент fileinput.input должен быть списком имен файлов.То, что вы хотите, может быть достигнуто с помощью

for line in gzip.open('/scratch/try.fastq.gz')
    print line

fileinput для поддержки идиомы, когда программа читает из списка файлов, возможно, предоставленных в командной строке, или стандартного ввода, если файлы не были указаны,Если вы все еще хотите использовать его, хотя в вашем примере это бесполезно, вам следует выполнить

for line in fileinput(['/scratch/try.fastq.gz'], openhook=gzip.open):
    print line
0 голосов
/ 24 февраля 2018

Как говорили другие источники, значение для openhook должно быть функцией, но это не значит, что вы не можете вызвать функцию для возврата функции. Например, если вы хотите поддерживать несколько разных типов входящих файлов, вы можете написать что-то вроде этого:

import fileinput
import gzip

def get_open_handler(compressed):
    if deciding_data:
        # mode comes in as 'r' by defualt, but that means binary to `gzip`
        return lambda file_name, mode: gzip.open(file_name, mode='rt')
    else:
        # the default mode of 'r' means text for `open`
        return open

# get args here

for line in fileinput.input(args.files, openhook=get_open_handler(args.compressed))
    print(line)

Как видите, мы вызываем функцию из openhook, но эта функция возвращает другую функцию. В этом случае мы исправляем mode из gzip.open, но мы можем делать все, что захотим, в том числе используя functools.partial, чтобы привязать некоторые значения к функции, чтобы при передаче значений по умолчанию filename и mode функции, назначенной на openhook, функция будет выполнять то, что вы хотите.

...