python3fileinput:压缩和结束编码的filehook?

2024-09-28 21:58:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要解压缩和解码一组gzip文件,而filehook模块(https://docs.python.org/3/library/fileinput.html)对这两个文件都有钩子,但我无法同时应用这两个文件:

有没有语法可以将这两个钩子应用到同一个FileInput实例上?在

fi = fileinput.FileInput(openhook=fileinput.hook_compressed)
fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))

Tags: 模块文件httpsorgdocslibraryhook解码
2条回答

没有办法把这些组合起来。您甚至不能通过传递文本模式将hook_compressed与默认的utf8一起使用,因为FileInput拒绝接受{},前提是{}总是指文本。在

唯一的解决办法就是自己写。在

def hook_compressed_encoded(encoding):
    def hook(filename, mode):
        ext = os.path.splitext(filename)[1]
        if ext == '.gz':
            import gzip
            return gzip.open(filename, 'rt', encoding=encoding)
        elif ext == '.bz2':
            import bz2
            return bz2.open(filename, 'rt', encoding=encoding)
        else:
            return open(filename, 'rt', encoding=encoding)
    return hook

fi = fileinput.FileInput(openhook=hook_compressed_encoded('iso-8859-1'))

看一下the source并注意到^{}和{a3}支持编码参数,您自己滚动应该不会太困难:

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

fi = fileinput.FileInput(openhook=hook_compressed_encoded('iso-8859-1'))

相关问题 更多 >