python gzipped fileinput返回二进制字符串而不是文本字符串

时间:2014-02-03 13:52:15

标签: python string file-io python-3.x gzip

当我使用模块fileinput循环遍历一组gzip压缩文件的行时:

for line in fileinput.FileInput(files=gzipped_files,openhook=fileinput.hook_compressed):

然后这些行是字节字符串而不是文本字符串。

当使用模块gzip时,可以通过使用'rt'而不是'rb'打开文件来防止这种情况:http://bugs.python.org/issue13989

对于模块fileinput是否有类似的修复,所以我可以让它返回文本字符串而不是字节字符串?我尝试添加mode ='rt',但后来我收到了这个错误:

ValueError: FileInput opening mode must be one of 'r', 'rU', 'U' and 'rb'

2 个答案:

答案 0 :(得分:4)

您必须实现自己的openhook函数才能使用编解码器打开文件:

import os

def hook_compressed_text(filename, mode, encoding='utf8'):
    ext = os.path.splitext(filename)[1]
    if ext == '.gz':
        import gzip
        return gzip.open(filename, mode + 't', encoding=encoding)
    elif ext == '.bz2':
        import bz2
        return bz2.open(filename, mode + 't', encoding=encoding)
    else:
        return open(filename, mode, encoding=encoding)

答案 1 :(得分:1)

参加聚会有点晚了,但是这样做会不会更简单?

for line in fileinput.FileInput(files=gzipped_files, openhook=fileinput.hook_compressed):
    if isinstance(line, bytes):
        line = line.decode()
    ...