python - 在 Python 3.4 中重写代码时出现 Bad Zip File 错误

标签 python pandas

我正在尝试将之前为 Python 2.7 编写的代码重写为 Python 3.4。我在下面的代码中的 zipfile = ZipFile(StringIO(zipdata)) 行中收到错误 zipfile.BadZipFile: File is not a zip file

import csv
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO
import pandas as pd
import os
from zipfile import ZipFile
from pprint import pprint, pformat
import urllib.request
import urllib.parse

try:
    import urllib.request as urllib2
except ImportError:
    import urllib2

my_url = 'http://www.bankofcanada.ca/stats/results/csv'
data = urllib.parse.urlencode({"lookupPage": "lookup_yield_curve.php",
                         "startRange": "1986-01-01",
                         "searchRange": "all"})
# request = urllib2.Request(my_url, data)
# result = urllib2.urlopen(request)
binary_data = data.encode('utf-8')
req = urllib.request.Request(my_url, binary_data)
result = urllib.request.urlopen(req)


zipdata = result.read().decode("utf-8",errors="ignore")
zipfile = ZipFile(StringIO(zipdata))

df = pd.read_csv(zipfile.open(zipfile.namelist()[0]))

df = pd.melt(df, id_vars=['Date'])

df.rename(columns={'variable': 'Maturity'}, inplace=True)

谢谢

最佳答案

您不应该对结果中返回的数据进行解码。数据是 ZipFile 的字节,而不是 unicode 字符串的编码字节。我认为您会感到困惑,因为在 Python 2 中没有区别,但在 Python 3 中您需要 BytesIO 而不是 StringIO。

因此,您的代码部分应为:

zipdata = result.read()

zipfile = ZipFile(BytesIO(zipdata))

df = pd.read_csv(zipfile.open(zipfile.namelist()[0]))

您返回的数据不是 utf-8 编码的,因此您无法以这种方式对其进行解码。如果您没有指定 errors = "ignore",您会发现更容易,但这很少是一个好主意......

关于python - 在 Python 3.4 中重写代码时出现 Bad Zip File 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013308/

相关文章:

python - 如何计算在 Pandas 中共享唯一字段的行

python - 如何将字符串格式化为两列列表

python - 如何在Python中使用websocket api?

CSS 中的 Python 变量

python - 无法运行 monkeyrunner 脚本 - java.lang.IllegalArgumentException : Bad level

python - 迭代到多级 pandas DataFrame 的优雅方法

python - 给定开始和结束日期的 Pandas,将它们分类为每周频率并计数

python - Pandas - 通过所有独特的组合组合两个系列

python - 如何在单个 catplot 图中绘制多个数据帧

python - 如何使用 asyncio 使 python 装饰器函数在 n 秒内重新安排函数?