使用熊猫从zip读取特定的csv文件

时间:2020-07-06 08:44:32

标签: python pandas

这是我感兴趣的数据。

http://fenixservices.fao.org/faostat/static/bulkdownloads/Production_Crops_E_All_Data.zip

它包含3个文件:

enter image description here

我想用熊猫下载zip并从名为Production_Crops_E_All_Data.csv的1个文件创建DataFrame

import pandas as pd
url="http://fenixservices.fao.org/faostat/static/bulkdownloads/Production_Crops_E_All_Data.zip"
df=pd.read_csv(url)

熊猫可以下载文件,可以使用zip,当然也可以使用csv文件。但是如何处理包含多个文件的1个特定文件?

现在我得到了错误

ValueError :('在压缩的zip文件%s中找到多个文件)

此帖子未回答我的问题,因为我有1个zip文件中有多个文件 Read a zipped file as a pandas DataFrame

2 个答案:

答案 0 :(得分:1)

From this link

编辑:已将python3 StringIO更新为io.StringIO

编辑:更新了urllib的导入,将StringIO的用法更改为BytesIO。另外,您的CSV文件不是utf-8编码,我尝试了latin1并有效。

尝试

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

r = urlopen("http://fenixservices.fao.org/faostat/static/bulkdownloads/Production_Crops_E_All_Data.zip").read()
file = ZipFile(io.BytesIO(r))
data_df = pd.read_csv(file.open("Production_Crops_E_All_Data.csv"), encoding='latin1')
data_df_noflags = pd.read_csv(file.open("Production_Crops_E_All_Data_NOFLAG.csv"), encoding='latin1')
data_df_flags = pd.read_csv(file.open("Production_Crops_E_Flags.csv"), encoding='latin1')

希望这会有所帮助!

答案 1 :(得分:0)

您可以使用python的datatable,它是python中Rdatatable的重新实现。

读入数据:

from datatable import fread

#The exact file to be extracted is known, simply append it to the zip name:
 url = "Production_Crops_E_All_Data.zip/Production_Crops_E_All_Data.csv"

 df = fread(url)

#convert to pandas

 df.to_pandas()

您同样可以在数据表中工作;请注意,它不像熊猫那样功能丰富;但这是一个功能强大且非常快速的工具。

更新:您也可以使用zipfile模块:

from zipfile import ZipFile
from io import BytesIO

with ZipFile(url) as myzip:
    with myzip.open("Production_Crops_E_All_Data.csv") as myfile:
        data = myfile.read()

#read data into pandas
#had to toy a bit with the encoding,
#thankfully it is a known issue on SO
#https://stackoverflow.com/a/51843284/7175713
df = pd.read_csv(BytesIO(data), encoding="iso-8859-1", low_memory=False)