Lecture de vastes fichiers CSV en Python
Dans Python 2.7, les utilisateurs rencontrent souvent des problèmes de mémoire lors de la lecture de fichiers CSV contenant des millions de lignes et des centaines de colonnes. Cet article aborde ces défis et propose des solutions pour traiter efficacement les gros fichiers CSV.
Code d'origine et problèmes
Le code fourni vise à lire des lignes spécifiques d'un fichier CSV basé sur sur un critère donné. Cependant, il charge toutes les lignes dans une liste avant le traitement, ce qui entraîne des erreurs de mémoire pour les fichiers dépassant 300 000 lignes.
Solution 1 : traiter les lignes de manière incrémentielle
Pour éliminer le problème de mémoire, il est crucial de traiter les lignes de manière incrémentale au lieu de les stocker dans une liste. Une fonction génératrice peut être utilisée pour y parvenir :
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
Cette fonction génère la ligne d'en-tête et les lignes suivantes qui correspondent au critère, puis arrête la lecture.
Solution 2 : Filtrage optimisé
Alternativement, une méthode de filtrage plus concise peut être utilisée :
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))
Cette méthode utilise les fonctions takewhile et dropwhile du module itertools pour filtrer les lignes.
Code mis à jour
Dans la fonction getdata, la compréhension de liste est remplacée par une compréhension de générateur :
def getdata(filename, criteria): for criterion in criteria: for row in getstuff(filename, criterion): yield row
Conclusion
En utilisant les fonctions du générateur et en optimisant les techniques de filtrage, il est possible de traiter efficacement des fichiers CSV volumineux, en évitant les erreurs de mémoire et en améliorant considérablement les performances.
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!