下面的代码下载一个zip文件,并存储其中包含的存档;它不会给出任何错误消息。
from io import BytesIO
import zipfile as zf
from urllib.request import urlopen
import pickle as pc # file manager
resp = urlopen('ftp://ftp.ibge.gov.br/Precos_Indices_de_Precos_ao_Consumidor/IPCA/Serie_Historica/ipca_SerieHist.zip')
zipfile = zf.ZipFile(BytesIO(resp.read()))
zipped_filenames = zipfile.namelist()
for filename in zipped_filenames:
print('Filename: ', filename)
xls_file = zipfile.read(filename)
with open(filename, 'wb') as output:
pc.dump(xls_file, output, pc.HIGHEST_PROTOCOL)
输出:
Filename: ipca_201807SerieHist.xls
当我尝试使用 Libre Office 打开文件"ipca_201807SerieHist.xls"(使用上述代码下载并提取(时,LO 无法识别该文件并尝试导入它。
如果我转到URL:"ftp://ftp.ibge.gov.br/Precos_Indices_de_Precos_ao_Consumidor/IPCA/Serie_Historica/ipca_SerieHist.zip",将"ipca_SerieHist.zip"文件保存在HD中,然后提取并打开"ipca_201807SerieHist.xls"文件,Libre Office会识别该文件。
两个文件"ipca_201807SerieHist.xls"的大小相似;下载的文件稍大 62994 字节与 62976 字节。 如果我比较内容,除了一些孤立的字符,它们似乎非常相似。
注意:"ipca_201807SerieHist.xls"是葡萄牙语。
正如 mkrieger1 所提到的,只需将最后一行更改为以下行即可解决问题。
for filename in zipped_filenames:
print('Filename: ', filename)
xls_file = zipfile.read(filename)
with open(filename, 'wb') as output:
output.write(xls_file)