我正在尝试从网站上抓取一些 .csv
文件。我目前有一个链接列表:
master_links = [
'http://mis.nyiso.com/public/csv/damlbmp/20161201damlbmp_zone_csv.zip',
'http://mis.nyiso.com/public/csv/damlbmp/20160301damlbmp_zone_csv.zip',
'http://mis.nyiso.com/public/csv/damlbmp/20160201damlbmp_zone_csv.zip']
当我尝试使用时:
pd.read_csv(master_links[0])]
它会返回错误,因为每个 .zip
文件中都包含多个 .csv
。我明白为什么这不起作用,但我还没有弄清楚如何解压缩这些文件,然后将 .csv 文件放入 pd.read_csv 中,而不将所有内容保存到我的计算机上。
这可能吗?
最佳答案
您可以使用 pandas.read_csv()
的自定义文件阅读器来完成此操作像:
代码:
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}
一些文档: ( ZipFile ) ( BytesIO ) ( urlopen )
测试代码:
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
from io import BytesIO
import zipfile
import pandas as pd
master_links = [
'http://mis.nyiso.com/public/csv/damlbmp/20161201damlbmp_zone_csv.zip',
'http://mis.nyiso.com/public/csv/damlbmp/20160301damlbmp_zone_csv.zip',
'http://mis.nyiso.com/public/csv/damlbmp/20160201damlbmp_zone_csv.zip']
dfs = fetch_multi_csv_zip_from_url(master_links[0])
print(dfs['20161201damlbmp_zone.csv'].head())
结果:
Time Stamp Name PTID LBMP ($/MWHr) \
0 12/01/2016 00:00 CAPITL 61757 21.94
1 12/01/2016 00:00 CENTRL 61754 16.85
2 12/01/2016 00:00 DUNWOD 61760 20.85
3 12/01/2016 00:00 GENESE 61753 16.16
4 12/01/2016 00:00 H Q 61844 15.73
Marginal Cost Losses ($/MWHr) Marginal Cost Congestion ($/MWHr)
0 1.21 -4.45
1 0.11 -0.45
2 1.58 -2.99
3 -0.49 -0.36
4 -0.55 0.00
关于python - 当 .csv 文件保存在 Python 中的 .zip 文件中时,如何从 url 中抓取 .csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48843761/