我正在尝试将之前为 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/