Lesen Sie eine komprimierte Datei als Pandas DataFrame


108

Ich versuche, eine CSV-Datei zu entpacken und an Pandas zu übergeben, damit ich an der Datei arbeiten kann.
Der Code, den ich bisher ausprobiert habe, lautet:

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'))

Nach der letzten Zeile erhalte ich, obwohl Python die Datei abrufen kann, am Ende des Fehlers ein "existiert nicht".

Kann mir jemand sagen, was ich falsch mache?

Antworten:


158

Wenn Sie eine komprimierte oder eine tar.gz-Datei in den Pandas-Datenrahmen lesen möchten, enthalten die read_csvMethoden diese spezielle Implementierung.

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

Oder die lange Form:

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

Beschreibung des Komprimierungsarguments aus den Dokumenten :

Komprimierung : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, Standard 'infer' Für die sofortige Dekomprimierung von Daten auf der Festplatte. Wenn 'infer' und filepath_or_buffer pfadartig sind, erkennen Sie die Komprimierung anhand der folgenden Erweiterungen: '.gz', '.bz2', '.zip' oder '.xz' (andernfalls keine Dekomprimierung). Wenn Sie 'zip' verwenden, darf die ZIP-Datei nur eine Datendatei enthalten, die eingelesen werden soll. Für keine Dekomprimierung auf Keine setzen.

Neu in Version 0.18.1: Unterstützung für die Komprimierung von 'zip' und 'xz'.


6
Es gibt keine Unterstützung für komprimierte Dateien, nur für gzip und bz2. Das ist irritierend, weil Reißverschluss ziemlich häufig ist. Ich stelle mir das vor, weil zip nicht Open Source ist?
— TC Proctor

24
zip wird jetzt in pandas 0.18.1
— nishant

1
Diese Lösung funktioniert für eine komprimierte Datei, jedoch nicht für .tar.gz-Dateien (Pandas 0.19.2). Tar.gz wird von Pandas nicht unterstützt! Siehe: github.com/pandas-dev/pandas/issues/…
— Tector

Könnten Sie uns bitte mitteilen, ob es einen bestimmten Grund für die Verwendung gibt quotechar?
— Herpes Free Engineer

Diese Antwort zeigt eine .tar.gzDatei, funktioniert aber wahrscheinlich nur mit einer .gzDatei.
— William Entriken

41

Ich denke, Sie möchten opendie ZipFile, die ein dateiähnliches Objekt zurückgibt, anstatt 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
Hinweis: Sie können die Datumsspalten beim Lesen analysieren:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
— Andy Hayden

So lesen Sie die erste Datei:pd.read_csv(z.open(z.infolist()[0].filename))
— user3226167

14

Anscheinend müssen Sie die Komprimierung nicht mehr angeben. Das folgende Snippet lädt die Daten aus filename.zip in df.

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

(Natürlich müssen Sie Trennzeichen, Header usw. angeben, wenn diese von den Standardeinstellungen abweichen.)


Dies sollte die beste Antwort sein, die anderen sind veraltet.
— rjurney

12

Für " zip " -Dateien können Sie verwenden import zipfileund Ihr Code funktioniert einfach mit diesen Zeilen:

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

Und das Ergebnis wird sein:

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

Bitte folgen Sie diesem Link.

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)

Willkommen bei Stack Overflow! Während dieser Code die Frage beantworten kann, würde die Bereitstellung eines zusätzlichen Kontexts entweder als Kommentar zum Code oder als separater Absatz darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
— Sardar Usama
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.