web-dev-qa-db-fra.com

Lire un fichier compressé en tant que pandas DataFrame

J'essaie de décompresser un fichier csv et de le transférer dans pandas afin que je puisse travailler sur le fichier.
Le code que j'ai essayé jusqu'ici est:

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

Après la dernière ligne, bien que python puisse obtenir le fichier, je reçois un "n'existe pas" à la fin de l'erreur.

Quelqu'un peut-il me dire ce que je fais mal?

81
user2793667

Si vous voulez lire un fichier compressé ou tar.gz dans pandas dataframe, le read_csv méthodes inclut cette implémentation particulière.

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

Ou la forme longue:

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

Description de l'argument de compression de docs :

compression : {'infère', 'gzip', 'bz2', 'zip', 'xz', aucune}, par défaut 'infère' pour sur décompression à la volée des données sur disque. Si "infer" et filepath_or_buffer sont similaires à un chemin, alors détectez la compression à partir des extensions suivantes: ".gz", ".bz2", ".Zip" ou ".xz" (sinon aucune décompression). Si vous utilisez ‘Zip’, le fichier Zip ne doit contenir qu’un fichier de données à lire. Réglez-le sur Aucun pour éviter toute décompression.

Nouveauté de la version 0.18.1: prise en charge de la compression "Zip" et "xz".

117
Suchit

Je pense que vous voulez open le ZipFile, qui retourne un objet de type fichier plutôt que 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)
35
Andy Hayden

Pour les fichiers "Zip", vous pouvez utiliser import zipfile et votre code fonctionnera simplement avec ces lignes:

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

Et le résultat sera:

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...
9
imanzabet

Il semble que vous n'ayez même plus besoin de spécifier la compression. L'extrait suivant charge les données de filename.Zip dans df.

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

(Bien entendu, vous devrez spécifier un séparateur, un en-tête, etc. s'ils sont différents des valeurs par défaut.)

9
TDS