web-dev-qa-db-fra.com

Lecture de fichiers compressés csv dans python

J'essaie d'obtenir des données à partir d'un fichier csv zippé. Existe-t-il un moyen de le faire sans décompresser tous les fichiers? Sinon, comment décompresser les fichiers et les lire efficacement?

18
Elyza Agosta

J'ai utilisé le module "zipfile" pour importer directement le Zip yo pandas dataframe. Disons que le nom du fichier est "intfile" et qu'il est en Zip nommé "THEZIPFILE".

import pandas as pd
import zipfile

zf = zipfile.ZipFile('C:/Users/Desktop/THEZIPFILE.Zip') 
df = pd.read_csv(zf.open('intfile.csv'))
38
Yaron

Si vous n'utilisez pas Pandas cela peut être fait entièrement avec la bibliothèque standard. Voici le code Python 3.7:

import csv
from io import TextIOWrapper
from zipfile import ZipFile

with ZipFile('yourfile.Zip') as zf:
    with zf.open('your_csv_inside_Zip.csv', 'r') as infile:
        reader = csv.reader(TextIOWrapper(infile, 'utf-8'))
        for row in reader:
            # process the CSV here
            print(row)
8
volker238

zipfile prend également en charge l'instruction with.

Donc, ajoutant à la réponse de yaron d'utiliser des pandas:

with zipfile.ZipFile('file.Zip') as Zip:
    with Zip.open('file.csv') as myZip:
        df = pd.read_csv(myZip) 
5
gaius_baltar

Oui. Vous voulez le module 'zipfile'

Vous ouvrez le fichier Zip lui-même avec zipfile.ZipInfo([filename[, date_time]])

Vous pouvez ensuite utiliser ZipFile.infolist() pour énumérer chaque fichier dans le Zip et l'extraire avec ZipFile.open(name[, mode[, pwd]])

4
brycem

Moderne Pandas depuis la version 0.18.1 supporte nativement les fichiers csv compressés: sa méthode read_csv a une compression paramètre: {'infer', 'gzip', 'bz2', 'Zip', 'xz', None}, 'infer' par défaut.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

3
Anatoly Alekseev

Je pensais que Yaron avait la meilleure réponse, mais j'ai pensé que j'ajouterais un code qui itérerait sur plusieurs fichiers dans un dossier Zip. Il annexera ensuite les résultats:

import os
import pandas as pd
import zipfile

curDir = os.getcwd()
zf = zipfile.ZipFile(curDir + '/targetfolder.Zip')
text_files = zf.infolist()
list_ = []

print ("Uncompressing and reading data... ")

for text_file in text_files:
    print(text_file.filename)
    df = pd.read_csv(zf.open(text_file.filename)
    # do df manipulations
    list_.append(df)

df = pd.concat(list_)
3
Arthur D. Howland

Une solution rapide peut être d'utiliser le code ci-dessous!

import pandas as pd

#pandas support Zip file reads
df = pd.read_csv("/path/to/file.csv.Zip")
2
Hari Prasad