使用熊猫从URL读取.zip中的.csv文件?

时间:2020-07-05 18:22:03

标签: python pandas csv geopandas

.zip文件中包含一个.csv文件,该文件来自我试图读取到Pandas DataFrame中的URL;我不想将.zip文件下载到磁盘,而是直接从URL读取数据。我意识到,只有.csv文件是.zip中包含的唯一文件时,pandas.read_csv()才能执行此操作,但是,当我运行此文件时:

import pandas as pd

# specify zipped comma-separated values url
zip_csv_url = 'http://www12.statcan.gc.ca/census-recensement/2016/geo/ref/gaf/files-fichiers/2016_92-151_XBB_csv.zip'
df1 = pd.read_csv(zip_csv_url)

我明白了:

ValueError: Multiple files found in compressed zip file ['2016_92-151_XBB.csv', '92-151-g2016001-eng.pdf', '92-151-g2016001-fra.pdf']

.zip的内容似乎以列表的形式排列;我想知道如何才能将新的DataFrame(df1)分配为.zip中唯一可用的.​​csv文件(因为我将使用的URL中的.zip文件中只有一个.csv文件)。谢谢!

N.B。

当我运行以下代码时,来自带有shapefiles的单独URL中的相应.zip文件不会对geopandas.read_file()造成任何影响:

import geopandas as gpd

# specify zipped shapefile url
zip_shp_url = 'http://www12.statcan.gc.ca/census-recensement/2011/geo/bound-limit/files-fichiers/2016/ldb_000b16a_e.zip'
gdf1 = gpd.read_file(zip_shp_url)

尽管.zip中也包含一个.pdf文件,如下图所示:

enter image description here

看来geopandas.read_file()能够仅读取创建GeoDataFrame所需的shapefile,而忽略了不必要的数据文件。由于它是基于Pandas的,因此Pandas是否也不应具有仅读取.zip中具有多个其他文件类型的.csv的功能?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

import zipfile
import pandas as pd
from io import BytesIO
from urllib.request import urlopen


resp = urlopen(  YOUR_ZIP_LINK  )
files_zip = zipfile.ZipFile(BytesIO(resp.read()))
# files_zip.namelist()
directory_to_extract_to = YOUR_DESTINATION_FOLDER
file = YOUR_csv_FILE_NAME
with files_zip as zip_ref:
    zip_ref.extract(file,directory_to_extract_to)
pd.read_csv(directory_to_extract_to + file)