将压缩文件作为pandas DataFrame读取

use*_*667 89 python zip pandas

我正在尝试解压缩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'))
Run Code Online (Sandbox Code Playgroud)

在最后一行之后,虽然python能够获取文件,但在错误结束时我得到"不存在".

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

小智 128

如果要将zipped或tar.gz文件读入pandas数据帧,则这些read_csv方法包括此特定实现.

df = pd.read_csv('filename.zip')
Run Code Online (Sandbox Code Playgroud)

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

压缩:{'推断','gzip','bz2','zip','xz',无},默认'推断'
用于磁盘数据的即时解压缩.

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

('zip'和'xz'压缩版本在0.18.1版本中添加)

  • pandas 0.18.1现在支持zip (21认同)
  • 不支持压缩文件,只支持gzip和bz2.这很刺激,因为拉链很常见.我想这是因为zip不是开源的? (6认同)

And*_*den 36

我想你想要openZipFile,它返回一个类似文件的对象,而不是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)
Run Code Online (Sandbox Code Playgroud)

  • 注意:您可以在阅读时解析日期列:`pd.read_csv(z.open('crime_incidents_2013_CSV.csv'),parse_dates = ['REPORTDATETIME','LASTMODIFIEDDATE']) (3认同)

TDS*_*TDS 11

似乎您甚至不必再指定压缩。以下代码段将文件名.zip中的数据加载到df中。

import pandas as pd
df = pd.read_csv('filename.zip')
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是最佳答案,其他答案已经过时了。 (2认同)

ima*_*bet 10

对于" 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
Run Code Online (Sandbox Code Playgroud)

结果将是:

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...
Run Code Online (Sandbox Code Playgroud)

  • 如果您的 zip 文件中有多个文件,则这是必需的。至少,这是我能够开始工作的。 (2认同)

小智 8

我猜你的样子如下

from io import BytesIO
import requests
import pandas as pd

result = requests.get("https://www.xxx.zzz/file.zip")
df = pd.read_csv(BytesIO(result.content),compression='zip', header=0, sep=',', quotechar='"')
Run Code Online (Sandbox Code Playgroud)

阅读这些文章以了解原因:https://medium.com/dev-bits/ultimate-guide-for-working-with-io-streams-and-zip-archives-in-python-3-6f3cf96dca50