使用 URL 中的 pandas 读取内部包含多个不同数据类型文件的 zip 文件

Read zip file with multiple, different data type files inside using pandas from an URL

我正在尝试从 URL.

中读取一个大的 (~850 mb) .csv 文件

问题是 .csv 文件在一个 .zip 文件中,该文件还包含一个 .pdf 文件,所以当我尝试在 pandas:

中阅读它时
df = pd.read_csv('link', encoding='latin1', sep=';')

它不起作用,因为它指出:

ValueError: Multiple files found in ZIP file. Only one file per ZIP: ['LEIAME.pdf', 'perfil_eleitorado_2018.csv']

我正在使用协作笔记本,所以最好的解决方案是直接从 link 打开 .zip 文件或将 .csv 文件上传到不需要权限的地方、登录或类似的方式直接在笔记本中打开它。

Obs:这只是我正在使用的大型 .csv 数据库之一,还有其他大小相似,甚至更大的数据库。

pd.read_csv() 函数允许第一个参数是 .zip 文件路径或 URL,但每个 ZIP 文件只支持一个文件.发布的 zip 文件有多个文件。

您可以遍历 zip 文件并将 CSV 数据作为缓冲对象读取。

import pandas as pd
import zipfile
from io import BytesIO

with zipfile.ZipFile("perfil_eleitorado_2018.zip", "r") as f:
    for name in f.namelist():
        if name.endswith('.csv'):
            with f.open(name) as zd:
                df = pd.read_csv(zd, encoding='latin1', sep=';')
            print(df)
            break

如果您想直接与 URL 交互 w/o 先下载它然后使用可以使用请求库。

import pandas as pd
import zipfile
from io import BytesIO
import requests

url = 'https://cdn.tse.jus.br/estatistica/sead/odsele/perfil_eleitorado/perfil_eleitorado_2018.zip'
r = requests.get(url)
buf1 = BytesIO(r.content)
with zipfile.ZipFile(buf1, "r") as f:
    for name in f.namelist():
        if name.endswith('.csv'):
            with f.open(name) as zd:
                df = pd.read_csv(zd, encoding='latin1', sep=';')
            print(df)
            break

输出:

    DT_GERACAO HH_GERACAO ANO_ELEICAO ... QT_ELEITORES_DEFICIENCIA QT_ELEITORES_INC_NM_SOCIAL
0   12/04/2021   13:55:01        2018 ...                        1                          0
1   12/04/2021   13:55:01        2018 ...                        2                          0
2   12/04/2021   13:55:01        2018 ...                        4                          0
3   12/04/2021   13:55:01        2018 ...                        2                          0
4   12/04/2021   13:55:01        2018 ...                       25                          0
..         ...        ...         ... ...                      ...                        ...