Читайте заархівований файл у вигляді файлів DataFrame


108

Я намагаюся розпакувати файл CSV і передати його в панди, щоб я міг працювати над файлом.
Я спробував поки що код:

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 вміє отримати файл, я отримую "не існує" в кінці помилки.

Може хтось скаже мені, що я роблю неправильно?

Відповіді:


159

Якщо ви хочете прочитати zipped або tar.gz файл у фреймі даних pandas, read_csvметоди включають саме цю реалізацію.

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

Або довга форма:

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

Опис аргументу стиснення з документів :

стиснення : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, за замовчуванням 'infer' Для декомпресії даних на диску на ходу. Якщо 'infer' та filepath_or_buffer є схожим на шлях, то виявіть стиснення з таких розширень: '.gz', '.bz2', '.zip' або '.xz' (інакше немає декомпресії). Якщо використовується "zip", ZIP-файл повинен містити лише один файл даних, який слід читати. Встановити значення None для недекомпресії.

Нове у версії 0.18.1: підтримка стиснення 'zip' та 'xz'.


6
Немає підтримки для блискавок, лише gzip та bz2. Це дратує, тому що блискавка досить поширена. Я думаю, це тому, що поштовий індекс не є відкритим кодом?
ТК Проктор

24
Zip тепер підтримується в пандах 0.18.1
nishant

1
Це рішення працює для файлу gzipped, але не для файлів .tar.gz (Pandas 0.19.2) Pandas не підтримує Tar.gz! Дивіться: github.com/pandas-dev/pandas/isissue/…
tector

Скажіть, будь-ласка, чи є якась причина для використання quotechar?
Вільний інженер з герпесу

Ця відповідь показує .tar.gzфайл, але він, ймовірно, працює лише з .gzфайлом.
Вільям Ентрікен

41

Я думаю, ви хочете до 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)

3
Примітка. Ви можете проаналізувати стовпці дат під час читання:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
Енді Хейден,

Щоб прочитати перший файл:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167

15

Здається, вам навіть більше не потрібно вказувати стиснення. Наступний фрагмент завантажує дані з filename.zip у df.

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

(Звичайно, вам потрібно буде вказати роздільник, заголовок тощо, якщо вони відрізняються від значень за замовчуванням.)


Це має бути першочерговою відповіддю, інші застаріли.
rjurney

12

Для " 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...

0

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)

Ласкаво просимо до переповнення стека! Хоча цей код може відповісти на питання, надаючи додатковий контекст або як коментарі до коду, або як окремий абзац щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Сардар Усама
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.