作为一个 pandas DataFrame,如何读取一个压缩文件?

178

我想解压缩一个csv文件并将其传递给pandas,以便我可以处理该文件。
到目前为止,我尝试过的代码是:

import requests, zipfile, StringIO
r = requests.get('http://data.octo.dc.gov/feeds/crime_incidents/archive/crime_incidents_2013_CSV.zip')
z = zipfile.ZipFile(StringIO.StringIO(r.content))
crime2013 = pandas.read_csv(z.read('crime_incidents_2013_CSV.csv'))

在最后一行之后,虽然Python能够获取文件,但我最终得到了一个“不存在”的错误。

有人可以告诉我我做错了什么吗?

6个回答

273

如果您想将压缩的zip或tar.gz文件读入pandas数据框中,read_csv方法包含此特定实现。

df = pd.read_csv('filename.zip')

或者长格式:

df = pd.read_csv('filename.zip', compression='zip', header=0, sep=',', quotechar='"')

来自文档的压缩参数说明:

compression:{‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None},默认为 ‘infer’ 用于在磁盘上进行实时解压缩。如果设置为‘infer’并且 filepath_or_buffer 是路径,则从以下扩展名检测压缩格式:‘.gz’、‘.bz2’、‘.zip’或‘.xz’(否则不解压)。如果使用‘zip’,ZIP 文件必须仅包含一个要读取的数据文件。设置为 None 则不进行解压缩。

0.18.1 版本中新增了对‘zip’和‘xz’压缩格式的支持。


8
不支持压缩文件,仅支持gzip和bz2。这很烦人,因为zip格式非常常见。我想这是因为zip不是开源的原因吧? - T.C. Proctor
36
pandas 0.18.1现在支持zip。 - krackoder
1
这个解决方案适用于gzipped文件,但不适用于.tar.gz文件(Pandas 0.19.2)。Pandas不支持tar.gz!请参见:https://github.com/pandas-dev/pandas/issues/12005#issuecomment-170277346 - tector
在这个答案中,补充一些提示。从 pandas 0.24.1 开始,支持以下压缩类型 compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’。并且您只需要将 csv 文件压缩即可。我在 Mac 上使用以下命令进行压缩:在命令行中输入 zip -r9 your_zip_file.zip your_file.csv - addicted
1
@addicted,我已经更新了答案,加入了新的压缩格式。 - Pierre H.
显示剩余7条评论

49

我认为您想要 打开 ZipFile,这将返回一个类似文件的对象,而不是 读取

In [11]: crime2013 = pd.read_csv(z.open('crime_incidents_2013_CSV.csv'))

In [12]: crime2013
Out[12]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 24567 entries, 0 to 24566
Data columns (total 15 columns):
CCN                            24567  non-null values
REPORTDATETIME                 24567  non-null values
SHIFT                          24567  non-null values
OFFENSE                        24567  non-null values
METHOD                         24567  non-null values
LASTMODIFIEDDATE               24567  non-null values
BLOCKSITEADDRESS               24567  non-null values
BLOCKXCOORD                    24567  non-null values
BLOCKYCOORD                    24567  non-null values
WARD                           24563  non-null values
ANC                            24567  non-null values
DISTRICT                       24567  non-null values
PSA                            24567  non-null values
NEIGHBORHOODCLUSTER            24263  non-null values
BUSINESSIMPROVEMENTDISTRICT    3613  non-null values
dtypes: float64(4), int64(1), object(10)

4
注意:在读取时,您可以解析日期列:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE']) - Andy Hayden
1
读取第一个文件的代码:pd.read_csv(z.open(z.infolist()[0].filename)) - user3226167

31

现在似乎甚至不需要再指定压缩方式了。以下代码片段将从 filename.zip 中加载数据到 df 中。

import pandas as pd
df = pd.read_csv('filename.zip')

当然,如果它们与默认值不同,您需要指定分隔符、标题等。


3
这应该是最佳答案,其他的已经过时了。 - rjurney

27

对于 "zip" 文件,您可以使用 import zipfile,并且您的代码将仅需以下几行即可正常工作:

import zipfile
import pandas as pd
with zipfile.ZipFile("Crime_Incidents_in_2013.zip") as z:
   with z.open("Crime_Incidents_in_2013.csv") as f:
      train = pd.read_csv(f, header=0, delimiter="\t")
      print(train.head())    # print the first 5 rows

结果将会是:
X,Y,CCN,REPORT_DAT,SHIFT,METHOD,OFFENSE,BLOCK,XBLOCK,YBLOCK,WARD,ANC,DISTRICT,PSA,NEIGHBORHOOD_CLUSTER,BLOCK_GROUP,CENSUS_TRACT,VOTING_PRECINCT,XCOORD,YCOORD,LATITUDE,LONGITUDE,BID,START_DATE,END_DATE,OBJECTID
0  -77.054968548763071,38.899775938598317,0925135...                                                                                                                                                               
1  -76.967309569035052,38.872119553647011,1003352...                                                                                                                                                               
2  -76.996184958456539,38.927921847721443,1101010...                                                                                                                                                               
3  -76.943077541353617,38.883686046653935,1104551...                                                                                                                                                               
4  -76.939209158039446,38.892278093281632,1125028...

4
如果您在 zip 文件中有多个文件,则需要进行此操作……至少,这是我已经能够成功运行的内容。 - blacktj

7

2

https://www.kaggle.com/jboysen/quick-gz-pandas-tutorial

请点击此链接。
import pandas as pd
traffic_station_df = pd.read_csv('C:\\Folders\\Jupiter_Feed.txt.gz', compression='gzip',
                                 header=1, sep='\t', quotechar='"')

#traffic_station_df['Address'] = 'address'

#traffic_station_df.append(traffic_station_df)
print(traffic_station_df)

欢迎来到 Stack Overflow!虽然这段代码可能回答了问题,但是通过在代码中添加注释或作为单独段落提供解决问题的方式和/或原因的附加上下文,可以提高答案的长期价值。 - Sardar Usama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接