【问题标题】:read json zipped directly from urlrquest直接从 urlrquest 读取压缩的 json
【发布时间】:2018-04-30 04:54:30
【问题描述】:

我想直接将文件读取到 python 而无需保存它 - zip 文件相对较小并且绝对适合 mem。

我目前正在尝试这个:

        import urllib
        import json
        access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip')
        data = json.loads(access_url.read().decode())

但我得到了错误: UnicodeDecodeError:“utf-8”编解码器无法解码位置 15 中的字节 0xa0:无效的起始字节

什么额外的步骤可以解决这个问题?

我正在使用 python 3.6。

谢谢!

【问题讨论】:

  • 这是一个 zip 文件,你想要什么?看到这个https://docs.python.org/2/library/zipfile.html
  • 您的 COAL.zip 究竟包含什么?您现在的问题是您将压缩存档视为 json 数据,这是不正确的。您需要从存档中提取包含 json 数据的实际文件。例如,您知道存档中文件的名称吗?存档是否包含许多文件?
  • @Hannu 它包含一个名为 COAL.txt 的文件,它是 json 格式。
  • @RaminNietzsche 是的,但是我想解压缩并获取 json,而不必将其保存在磁盘中,因为这是小文件...

标签: python json api


【解决方案1】:

您现在将压缩存档(可以包含许多文件)视为包含实际数据的文件。让我们假设您的 zip 仅包含一个文件,该文件随后包含实际的 JSON 数据。这会起作用:

import zipfile
import io
import urllib
import json

access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip')

z = zipfile.ZipFile(io.BytesIO(access_url.read()))
data = json.loads(z.read(z.infolist()[0]).decode())
print(data)

或者类似的东西。我实际上无法测试实时数据,但试一试。它基本上解压缩在您的存档中找到的第一个文件,然后将其视为 json。

【讨论】:

    【解决方案2】:
    import urllib.request
    import json
    from io import BytesIO
    from zipfile import ZipFile
    
    
    access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip')
    zf = ZipFile(BytesIO(access_url.read()))
    zdata = zf.read('COAL.txt')
    
    print(zdata)
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2023-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多