压缩文件从 URL 到 Python (Pandas)

Zipped File from URL to Python (Pandas)

我想使用以下代码从 Gitlab 加载一个压缩文件到我的 Jupyter Notebook:


link='https://git. ... master/data.zip'

import urllib.request
urllib.request.urlretrieve(link, "data.zip")
import zipfile
compressed_file = zipfile.ZipFile('data.zip')
csv_file = compressed_file.open('data.csv')
df = pd.read_csv(csv_file)

我无法下载它,我需要从 URL!

获取数据

我在第 4 行遇到以下错误 (----> 4 compressed_file = zipfile.ZipFile('data.zip'))

BadZipFile: 文件不是 zip 文件

我的代码有什么错误?

您的代码示例不可重现。下面的代码显示了如何从 URL 下载 zip 文件并解压缩。它是 geojson,因此使用 json.loads(),但对于 CSV 数据,这可以是 pd.read_csv()。 这实际上是一个三步过程

  • 将 URL 传递给 requests.get() 并将块下载到本地文件
  • 检查此 zip 文件的内容以查找您要使用的文件zfile.infolist()
  • 打开文件句柄并使用它。对于你的情况 pd.read_csv()

所有独立于使用的标准请求和文件处理。

import requests
import pandas as pd
from pathlib import Path
from zipfile import ZipFile
import json, io

# source geojson for country boundaries
geosrc = pd.json_normalize(requests.get("https://pkgstore.datahub.io/core/geo-countries/7/datapackage.json").json()["resources"])
fn = Path(geosrc.loc[geosrc["name"].eq("geo-countries_zip"), "path"].values[0]).name

if not Path.cwd().joinpath(fn).exists():
    r = requests.get(geosrc.loc[geosrc["name"].eq("geo-countries_zip"), "path"].values[0],stream=True,)
    with open(fn, "wb") as fd:
        for chunk in r.iter_content(chunk_size=128):
            fd.write(chunk)

zfile = ZipFile(fn)
with zfile.open(zfile.infolist()[0]) as f:
    geojson = json.load(f)