【问题标题】:Read file saved using gzip: why is the file handle a string?读取使用 gzip 保存的文件:为什么文件句柄是字符串?
【发布时间】:2020-11-28 12:22:22
【问题描述】:

我有一个列表,假设它是:

sentcorpus = [["hello", "how", "are", "you", "?"], ["hello", "I", "'m", "fine"]]

我想用gzip格式保存:

import gzip
import json
with gzip.open('corpus.json.gz', 'wb') as fileh:
    fileh.write(json.dumps(sentcorpus).encode("utf8"))

那么这样读回来是合乎逻辑的:

with gzip.open('wbec_corpus.json.gz', 'rb') as fileh:
    sentcorpus = json.load(fileh.read().decode("utf8"))

但没有:

AttributeError: 'str' object has no attribute 'read'

相反,这个可行:

with gzip.open('wbec_corpus.json.gz', 'rb') as fileh:
    sentcorpus = json.load(fileh)

为什么fileh 是字符串而不是文件句柄?

【问题讨论】:

    标签: python string gzip binaryfiles binary-data


    【解决方案1】:

    这不是文件对象,JSON 库正在抛出错误。为了理解我们需要看 json.loadJSON.loads

    json.load(fp, **)

    反序列化 fp(支持 .read() 的文本文件或二进制文件 包含 JSON 文档)到使用此转换的 Python 对象 表。

    json.loads(s, )

    使用此转换表将 s(包含 JSON 文档的 str、bytes 或 bytearray 实例)反序列化为 Python 对象。

    简而言之,JSON.load 不需要 .read 对象,它需要一个文件指针;但是 JSON.loads 确实需要字符串或 file.read()

    所以下面这两行都可以工作

    sentcorpus = json.loads(fileh.read().decode("utf8"))
    sentcorpus = json.load(fileh)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多