[英]Using Pandas, how to read a csv file inside a zip file which you fetch using an url[Python]
[英]Read zip file with multiple, different data type files inside using pandas from an URL [duplicate]
我正在尝试从URL读取一个大的 (~850 mb) .csv 文件。
问题是 .csv 文件位于一个 .zip 文件中,该文件还包含一个 .pdf 文件,所以当我尝试在 pandas 中读取它时:
df = pd.read_csv('link', encoding='latin1', sep=';')
它不起作用,因为它指出:
ValueError:在 ZIP 文件中找到多个文件。 每个 ZIP 只有一个文件:['LEIAME.pdf', 'perfil_eleitorado_2018.csv']
我正在使用协作笔记本,因此最好的解决方案是直接从链接打开 .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 交互而不先下载它,那么可以使用请求库。
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
.. ... ... ... ... ... ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.