2016-08-18 8 views
2

Ich muss eine große CSV-Datei fast von 100K Zeilen in der Datei lesen, auch wird es sehr einfach sein, diese Datei zu verarbeiten, wenn ich jede Dateizeile in einem Wörterbuchformat lesen kann.Speichert csv.DictReader Datei im Speicher?

Nach wenig Forschung fand ich Pythons eingebaute Funktion csv.DictReader aus dem CSV-Modul.

Aber in der Dokumentation ist nicht klar, ob es die gesamte Datei im Speicher speichert oder nicht.

Aber es hat erwähnt, dass:

Die Feldnamen Parameter eine Sequenz, deren Elemente ist mit den Bereichen der Eingangsdaten zugeordnet ist, um.

Aber ich bin nicht sicher, ob die Sequenz im Speicher gespeichert ist oder nicht.

Die Frage ist also, speichert es ganze Datei im Speicher?

Wenn ja, gibt es eine andere Option zum Lesen einer einzelnen Zeile als Generaror-Ausdruck aus der Datei und Lesen der Zeile als dict.

Hier ist mein Code:

def file_to_dictionary(self, file_path): 
    """Read CSV rows as a dictionary """ 
    file_data_obj ={} 
    try: 
     self.log("Reading file: [{}]".format(file_path)) 
     if os.path.exists(file_path): 
      file_data_obj = csv.DictReader(open(file_path, 'rU')) 
     else: 
      self.log("File does not exist: {}".format(file_path)) 
    except Exception as e: 
     self.log("Failed to read file.", e, True) 
    return file_data_obj 

Antwort

3

Soweit im bewusst die DictReader Objekt, das Sie erstellen, in Ihrem Fall file_data_obj, ist ein Generatortyp Objekt.

Generatorobjekte werden nicht im Speicher gespeichert, sondern können nur einmal durchlaufen werden!

Um die Feldnamen Ihrer Daten als Liste drucken Sie einfach verwenden können: print file_data_obj.fieldnames

Zweitens finde ich, in meiner Erfahrung es viel einfacher, eine Liste der Wörterbücher zu verwenden, wenn Daten aus CSV-Dateien zu lesen, wo jedes Wörterbuch repräsentiert eine Zeile in Ihrer Datei. Beachten Sie Folgendes:

def csv_to_dict_list(path): 
    csv_in = open(path, 'rb') 
    reader = csv.DictReader(csv_in, restkey=None, restval=None, dialect='excel') 
    fields = reader.fieldnames 
    list_out = [row for row in reader] 
    return list_out, fields 

Mit der Funktion oben (oder so ähnlich), können Sie Ihr Ziel mit ein paar Zeilen acheive. ZB:

data, data_fields = csv_to_dict_list(path) 
print data_fields (prints fieldnames) 
print data[0] (prints first row of data from file) 

Hoffe, das hilft! Luke

Verwandte Themen