【问题标题】:UnicodeDecodeError on Windows, but not when running the exact same code on MacWindows 上的 UnicodeDecodeError,但在 Mac 上运行完全相同的代码时不会
【发布时间】:2019-05-21 21:46:48
【问题描述】:

我正在尝试通过 API 下载 json 数据。代码如下:

import urllib.request, ssl, json

context = ssl._create_unverified_context()
rsbURL = "https://rsbuddy.com/exchange/summary.json"
with urllib.request.urlopen(rsbURL, context=context) as url:
    data = json.loads(url.read().decode('UTF-8'))

这段代码在我的 Mac 上运行良好,我确认 data 是它应该是的——json 字符串。但是,当我在 Windows 上运行完全相同的代码时,会出现此错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

发生了什么,我该如何解决?

【问题讨论】:

  • 你能试试没有json.loads.decode()命令的代码吗?您的 SSL 库可能因环境而异。这可能会导致 url 在一个环境(可能是 Windows)上读取错误。
  • 我刚刚尝试过,在 Mac 上我得到了b'{"2":{"id":2,"name":"Cannonball","members":true,"sp":5,"buy_average":163,"buy_quantity":276835,"sell_average":161,"sell_quantity":642206,"overall_average":161,"overall_quantity":919041}...,它可以作为 JSON 读取。但在 Windows 上,我得到b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xcc\xbd]s$G\x8e%\xfaWhz\xd2\xda\xf4\xae1"\xf2s\xde\xa4R\xb7\xbagZ\ ,它不能作为 JSON 读取。当我尝试时,错误是一样的:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
  • 该代码适用于我在 Windows 下。您可以尝试将问题分为两个子问题:文件下载和文件解码。您可以保存文件,然后使用open('summary.json', 'rb').read().decode('utf-8') 看看是否有效。

标签: python python-3.x python-unicode


【解决方案1】:

看起来服务器出于某种原因正在发送压缩响应(除非您明确设置 accept-encoding 标头,否则它不应该这样做)。您可以调整您的代码以使用如下压缩响应:

import gzip
import urllib.request, ssl, json

context = ssl._create_unverified_context()
rsbURL = "https://rsbuddy.com/exchange/summary.json"
with urllib.request.urlopen(rsbURL, context=context) as url:
    if url.info().get('Content-Encoding') == 'gzip':
        body = gzip.decompress(url.read())
    else:
        body = url.read()
data = json.loads(body)

【讨论】:

  • 可能相关:stackoverflow.com/questions/3947120/…。使用请求可能更容易......
  • 有趣!你真的得到压缩数据吗?因为它对我有用而无需压缩。这是否取决于 Python 版本?还是服务器?或者可能是修改连接的防火墙/病毒扫描程序/VPN/代理服务器?
猜你喜欢
  • 2022-11-10
  • 2021-07-27
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多