使用 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
.. ... ... ... ... ... ...
我正在尝试从 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
.. ... ... ... ... ... ...