使用fileinput.input()读取gzip文件

时间:2011-12-09 16:38:40

标签: gzip file-io

我正在使用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文件呢? THX

2 个答案:

答案 0 :(得分:1)

不,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

答案 1 :(得分:0)

正如其他消息来源所说,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的{​​{1}},但我们可以做任何我们想做的事情,包括使用gzip.open将某些值绑定到函数,以便在默认{{1 }}和functools.partial传递给分配给filename的函数,该函数将执行您想要的操作。