【发布时间】:2018-06-22 15:19:35
【问题描述】:
我一直在使用用户定义的函数来打开 ZIP 文件中包含的 CSV 文件,这对我来说效果很好。
How to scrape .csv files from a url, when they are saved in a .zip file in Python?
现在我正在尝试打开一个包含在 ZIP 中的 CSV 文件,该 ZIP 包含在另一个 ZIP 中,但遇到了一些麻烦。
我收到此错误,而不是使用 CSV 中的数据获取数据帧的预期输出:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 0: invalid start byte
这是有道理的,因为我正在尝试使用 read_csv() 打开一个 zip 文件
import pandas as pd
def fetch_multi_csv_zip_from_url(url, filenames=(), *args, **kwargs):
assert kwargs.get('compression') is None
req = urlopen(url)
zip_file = zipfile.ZipFile(BytesIO(req.read()))
if filenames:
names = zip_file.namelist()
for filename in filenames:
if filename not in names:
raise ValueError(
'filename {} not in {}'.format(filename, names))
else:
filenames = zip_file.namelist()
return {name: pd.read_csv(zip_file.open(name), *args, **kwargs)
for name in filenames}
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
from io import BytesIO
import zipfile
final_links_list =['http://www.nemweb.com.au/REPORTS/ARCHIVE/Dispatch_SCADA/PUBLIC_DISPATCHSCADA_20170523.zip', 'http://www.nemweb.com.au/REPORTS/ARCHIVE/Dispatch_SCADA/PUBLIC_DISPATCHSCADA_20170524.zip']
l = len(final_links_list)
for j in range(0,l):
print(j)
dfs = fetch_multi_csv_zip_from_url(final_links_list[j])
这是我一直在使用的代码,我发现我必须更改以下开头的行:
return {name: pd.read_csv(zip_file.open(name)
因为它不再返回一个 csv 文件,而是一个 zip 文件。
【问题讨论】:
-
我已经尝试关注这个答案stackoverflow.com/questions/40009022/…,但又迷路了,因为对象是 zip 文件,而不是 csv,不知道如何返回并打开 zip 文件
-
那么你需要嵌套 zip 对象上的另一个 'zipfile.ZipFile`。
-
这不是MCVE,因为没有用于测试的示例数据,也没有预期的输出。
-
如果有人运行上面的代码,它会出现错误吗?如果不是,那么它不是 MCVE。不是 V,可验证。如果它正常工作,显示您期望的结果也是有帮助的。
-
@LukaVlaskalic:抱歉,我的意思是
zipfile.ZipFile()。