这是我感兴趣的数据。
http://fenixservices.fao.org/faostat/static/bulkdownloads/Production_Crops_E_All_Data.zip
它包含3个文件:
我想用熊猫下载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
答案 0 :(得分:1)
编辑:已将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)