Maison > développement back-end > Tutoriel Python > Comment gérer efficacement les gros fichiers CSV dans Python 2.7 ?

Comment gérer efficacement les gros fichiers CSV dans Python 2.7 ?

Mary-Kate Olsen
Libérer: 2024-11-08 03:32:02
original
642 Les gens l'ont consulté

How to Effectively Handle Large CSV Files in Python 2.7?

Lecture de gros fichiers .csv en Python

Problème : Lecture de fichiers .csv volumineux (jusqu'à 1 million de lignes, 200 colonnes) en Python 2.7 rencontre des erreurs de mémoire.

L'approche initiale parcourt l'intégralité du fichier et stocke les données en mémoire sous forme de listes. Cependant, cette méthode devient peu pratique pour les fichiers volumineux, car elle consomme trop de mémoire.

Solution :

1. Traitez les lignes au fur et à mesure de leur production :

Évitez de charger l'intégralité du fichier en mémoire. Au lieu de cela, traitez les lignes au fur et à mesure qu'elles sont générées à l'aide d'une fonction génératrice.

def getstuff(filename, criterion):
    with open(filename, "rb") as csvfile:
        datareader = csv.reader(csvfile)
        yield next(datareader)  # yield the header row
        for row in datareader:
            if row[3] == criterion:
                yield row
Copier après la connexion

2. Utiliser les fonctions du générateur pour le filtrage :

Filtrer les données lors de l'itération dans le fichier à l'aide des fonctions du générateur. Cette approche permet de faire correspondre plusieurs lignes consécutives répondant à un critère spécifique.

def getstuff(filename, criterion):
    with open(filename, "rb") as csvfile:
        datareader = csv.reader(csvfile)
        yield next(datareader)  # yield the header row
        yield from takewhile(
            lambda r: r[3] == criterion,
            dropwhile(lambda r: r[3] != criterion, datareader))
        return
Copier après la connexion

3. Optimiser la consommation de mémoire :

Refactorisez getdata() pour utiliser également une fonction génératrice, en garantissant qu'une seule ligne est conservée en mémoire à tout moment.

def getdata(filename, criteria):
    for criterion in criteria:
        for row in getstuff(filename, criterion):
            yield row
Copier après la connexion

Conseils supplémentaires pour la rapidité :

  • Utilisez csv.reader avec un paramètre de taille de bloc : Lisez les fichiers en morceaux plus petits pour réduire l'empreinte mémoire.
  • Envisagez d'utiliser un moteur de base de données : Si les données correspondent, stockez-les dans une base de données pour un traitement plus rapide et plus efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal