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?

user2793667
quelle

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

Suchit
quelle
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)
Andy Hayden
quelle
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.)

TDS
quelle
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...
imanzabet
quelle
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)
Suryakanta Karan
quelle
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