将压缩文件作为pandas DataFrame读取

问题描述 投票:72回答:4

我正在尝试解压缩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能够获取文件,但在错误结束时我得到“不存在”。

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

python zip pandas
4个回答
117
投票

如果您想将zipped或tar.gz文件读入pandas数据帧,read_csv方法包括此特定实现。

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

或者长形式:

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

来自docs的压缩参数的描述:

压缩:{'推断','gzip','bz2','zip','xz',无},默认'推断'用于磁盘数据的即时解压缩。如果'推断'和filepath_or_buffer是类似路径的,那么从以下扩展中检测压缩:'。gz','。bz2','。zip'或'.xz'(否则无解压缩)。如果使用'zip',则ZIP文件必须只包含一个要读入的数据文件。设置为None表示不进行解压缩。

版本0.18.1中的新功能:支持'zip'和'xz'压缩。


35
投票

我想你想要qazxsw poi Zip文件,它返回一个类似文件的对象,而不是qazxsw poi:

open

9
投票

对于“zip”文件,您可以使用read,您的代码将只使用以下行:

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)

结果将是:

import zipfile

9
投票

看来你甚至不必再指定压缩了。以下代码段将filename.zip中的数据加载到df中。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.