【问题标题】:python gzipped fileinput returns binary string instead of text stringpython gzipped fileinput返回二进制字符串而不是文本字符串
【发布时间】:2014-02-03 13:52:14
【问题描述】:

当我使用模块文件输入循环一组压缩文件的行时,如下所示:

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

那么这些行是字节字符串而不是文本字符串。

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

模块文件输入是否有类似的修复,所以我可以让它返回文本字符串而不是字节字符串?我尝试添加 mode='rt',但随后出现此错误:

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

【问题讨论】:

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


    【解决方案1】:

    您必须实现自己的 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)
    

    【讨论】:

    • 在得到 ValueError: Invalid mode: 'rt' 后只需阅读docs.python.org/3/library/bz2.html。要以文本(或二进制)模式打开 bz2 压缩文件,请使用 bz2.open。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-20
      • 2019-08-08
      • 2015-11-21
      • 2021-05-09
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多