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?
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".
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)
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...
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.)