2011-12-09 31 views
2

我使用的FileInput讀一些大的數據:使用fileinput.input()讀取的gzip文件

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

回答

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

其實這並沒有真正的工作.. – user815408

+0

這是我的另一篇文章:http://stackoverflow.com/questions/8454344/fileinput-usage-with-openbook-hook-compressed – user815408

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調用一個函數,但函數返回另一個函數。在這種情況下,我們正在修復的gzip.open,但我們可以做任何我們想要的,包括使用functools.partial將某些值綁定到某個函數,以便當默認的filenamemode傳遞給指定給openhook的函數時,該函數將做你想做的事。