2015-06-23 37 views
0

我正在尝试将先前为Python 2.7写入的代码重写为Python 3.4。我在下面的代码中得到了zipfile = ZipFile(StringIO(zipdata))行中的错误zipfile.BadZipFile: File is not a zip file在Python 3.4中重写代码时出现错误的Zip文件错误

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) 

谢谢

+0

你确定你得到的文件仍然是一个zip文件吗? – Xymostech

+0

@Xymostech刚刚检查过它。是的。 – user131983

回答

1

你不应该等你回来的结果的数据进行解码。数据是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",你会发现更容易,这很少是一个好主意......