Прочтите заархивированный файл как pandas DataFrame

109

Я пытаюсь разархивировать файл 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 может получить файл, я получаю сообщение «не существует» в конце ошибки.

Может кто подскажет, что я делаю неправильно?

user2793667
источник

Ответы:

160

Если вы хотите прочитать заархивированный файл или файл 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-файл должен содержать только один файл данных для чтения. Установите значение «Нет», чтобы не распаковывать файлы.

Новое в версии 0.18.1: поддержка сжатия zip и xz.

Сучит
источник
6
Нет поддержки заархивированных файлов, только gzip и bz2. Это раздражает, потому что молнии довольно распространены. Я полагаю, это потому, что zip не с открытым исходным кодом?
TC Proctor
24
zip теперь поддерживается в pandas 0.18.1
nishant
1
Это решение работает для сжатого файла, но не для файлов .tar.gz (Pandas 0.19.2) Tar.gz не поддерживается Pandas! См: github.com/pandas-dev/pandas/issues/...
TECTOR
Не могли бы вы рассказать нам, есть ли конкретная причина для использования quotechar?
Инженер по
В этом ответе показан .tar.gzфайл, но он, вероятно, работает только с .gzфайлом.
Уильям Энтрикен 01
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')

(Конечно, вам нужно будет указать разделитель, заголовок и т. Д., Если они отличаются от значений по умолчанию.)

TDS
источник
Это должен быть главный ответ, остальные устарели.
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...
Imanzabet
источник
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)
Сурьяканта Каран
источник
Добро пожаловать в Stack Overflow! Хотя этот код может ответить на вопрос, предоставление дополнительного контекста либо в виде комментариев к коду, либо в виде отдельного абзаца относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Сардар Усама,