175 votes

Lire un fichier compressé sous forme de DataFrame pandas

Je suis en train d'essayer de dézipper un fichier csv et de le passer à pandas pour pouvoir travailler dessus.
Le code que j'ai essayé jusqu'à présent 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 soit capable de récupérer le fichier, je reçois une erreur "n'existe pas" à la fin.

Est-ce que quelqu'un peut me dire ce que je fais incorrectement?

267voto

Suchit Points 2779

Si vous voulez lire un fichier zippé ou tar.gz dans un dataframe pandas, la méthode read_csv comprend cette implémentation particulière.

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

Ou sous sa forme longue :

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

Description de l'argument de compression des docs:

compression : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, valeur par défaut 'infer' Pour la décompression à la volée de données sur disque. Si 'infer' et que filepath_or_buffer est de type chemin, alors détecter la compression à partir des extensions suivantes : '.gz', '.bz2', '.zip', ou '.xz' (sinon aucune décompression). Si 'zip' est utilisé, le fichier ZIP doit contenir un seul fichier de données à lire. Mettez None pour ne pas décompresser.

Nouveau dans la version 0.18.1 : support pour les compressions 'zip' et 'xz'.

48voto

Andy Hayden Points 38010

Je pense que vous voulez ouvrir le fichier ZipFile, qui renvoie un objet similaire à un fichier, plutôt que de lire:

In [11]: crime2013 = pd.read_csv(z.open('crime_incidents_2013_CSV.csv'))

In [12]: crime2013
Out[12]:

Int64Index: 24567 entrées, 0 à 24566
Colonnes de données (total 15 colonnes):
CCN                            24567  valeurs non nulles
REPORTDATETIME                 24567  valeurs non nulles
SHIFT                          24567  valeurs non nulles
OFFENSE                        24567  valeurs non nulles
METHOD                         24567  valeurs non nulles
LASTMODIFIEDDATE               24567  valeurs non nulles
BLOCKSITEADDRESS               24567  valeurs non nulles
BLOCKXCOORD                    24567  valeurs non nulles
BLOCKYCOORD                    24567  valeurs non nulles
WARD                           24563  valeurs non nulles
ANC                            24567  valeurs non nulles
DISTRICT                       24567  valeurs non nulles
PSA                            24567  valeurs non nulles
NEIGHBORHOODCLUSTER            24263  valeurs non nulles
BUSINESSIMPROVEMENTDISTRICT    3613  valeurs non nulles
dtypes: float64(4), int64(1), object(10)

29voto

TDS Points 159

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

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

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

25voto

imanzabet Points 959

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())    # afficher les 5 premières lignes

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

7voto

MajorDaxx Points 1

Je suppose que ce que vous recherchez est le suivant

from io import BytesIO
import requests
import pandas as pd

result = requests.get("https://www.xxx.zzz/file.zip")
df = pd.read_csv(BytesIO(result.content),compression='zip', header=0, sep=',', quotechar='"')

Lisez cet article pour comprendre pourquoi : https://medium.com/dev-bits/ultimate-guide-for-working-with-i-o-streams-and-zip-archives-in-python-3-6f3cf96dca50

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X