我正在使用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
答案 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
的函数,该函数将执行您想要的操作。