138 votes

Lecture d'un énorme fichier .csv

J'essaie actuellement de lire des données à partir de fichiers .csv en Python 2.7 avec jusqu'à 1 million de lignes et 200 colonnes (les fichiers vont de 100 mb à 1,6 gb). Je peux le faire (très lentement) pour les fichiers de moins de 300 000 lignes, mais dès que je dépasse ce chiffre, j'obtiens des erreurs de mémoire. Mon code ressemble à ceci :

def getdata(filename, criteria):
    data=[]
    for criterion in criteria:
        data.append(getstuff(filename, criteron))
    return data

def getstuff(filename, criterion):
    import csv
    data=[]
    with open(filename, "rb") as csvfile:
        datareader=csv.reader(csvfile)
        for row in datareader: 
            if row[3]=="column header":
                data.append(row)
            elif len(data)<2 and row[3]!=criterion:
                pass
            elif row[3]==criterion:
                data.append(row)
            else:
                return data

La raison de la clause else dans la fonction getstuff est que tous les éléments qui répondent au critère seront répertoriés ensemble dans le fichier csv, donc je quitte la boucle lorsque je les dépasse pour gagner du temps.

Mes questions sont les suivantes :

  1. Comment faire pour que cela fonctionne avec les plus gros fichiers ?

  2. Y a-t-il un moyen de le rendre plus rapide ?

Mon ordinateur possède 8 Go de RAM, fonctionne sous Windows 7 64 bits et son processeur est de 3,40 GHz (je ne suis pas certain des informations dont vous avez besoin).

2voto

Rishabh Agrahari Points 817

Voici une autre solution pour Python3 :

import csv
with open(filename, "r") as csvfile:
    datareader = csv.reader(csvfile)
    count = 0
    for row in datareader:
        if row[3] in ("column header", criterion):
            doSomething(row)
            count += 1
        elif count > 2:
            break

aquí datareader est une fonction de générateur.

0voto

Mike T Points 7385

Si vous utilisez pandas et disposez de beaucoup de RAM (suffisamment pour lire le fichier entier en mémoire), essayez d'utiliser pd.read_csv con low_memory=False par exemple :

import pandas as pd
data = pd.read_csv('file.csv', low_memory=False)

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