python - 当 .csv 文件保存在 Python 中的 .zip 文件中时,如何从 url 中抓取 .csv 文件?

标签 python pandas csv zip

我正在尝试从网站上抓取一些 .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/

相关文章:

python - 为 Pandas 数据框中B列中的绝对数字分配A列中的相同值

python-3.x - python Pandas 中的条件日期连接

Ruby 1.9.2 导出 CSV 字符串而不生成文件

java - 使用随机行顺序测试 csv 文件是否相等 (Junit)

python - 查找两个 numpy 数组的交点坐标

Python行文件迭代和奇怪的字符

python - 如何在 Linux 上使正在运行的函数及其所有子进程超时?

python - 使用 pandas 和 matplotlib 绘制多条线图

csv - 如何在电子表格中从雅虎财经导入历史数据 (CSV)

python - 使用 Python 写入文本文件时出现编码问题