2016-06-27 4 views
0

iterieren Ich habe eine große CSV-Datei (~ 250000 Zeilen) und bevor ich arbeite vollständig Parsing und Sortierung es versuchte ich nur einen Teil davon durch Schreiben anzuzeigen es in eine Textdatei.Schleife, die eine bestimmte Anzahl von Malen durch eine CSV in Python

csvfile = open(file_path, "rb") 
    rows = csvfile.readlines() 
    text_file = open("output.txt", "w") 
    row_num = 0 
    while row_num < 20: 
     text_file.write(", ".join(row[row_num])) 
     row_num += 1 
    text_file.close() 

Ich mag durch die CSV-Datei wiederholen und nur einen kleinen Teil davon in eine Textdatei schreiben, so kann ich sehen, wie sie tut dies und sehen, ob es von Nutzen für mich sein würde. Derzeit endet die Textdatei leer.

Eine Möglichkeit, die ich tun könnte wäre, die Datei mit einer for-Schleife zu durchlaufen, die nach einer bestimmten Anzahl von Iterationen endet, aber ich könnte falsch liegen und ich bin mir nicht sicher, wie das geht, irgendwelche Ideen?

+1

Sie scheinen ein 'für Zeile zu fehlen in Zeilen: 'Zeile. –

+0

@joelgoldstick wo? –

Antwort

2

Es ist nichts speziell falsch mit dem, was Sie tun, aber es ist nicht besonders Pythonic. Insbesondere das Lesen der gesamten Datei in den Speicher mit readlines() am Anfang scheint sinnlos, wenn Sie nur 20 Zeilen verwenden.

Stattdessen können Sie eine for-Schleife mit Enumerate und brechen, wenn nötig.

csvfile = open(file_path, "rb") 
text_file = open("output.txt", "w") 
for i, row in enumerate(csvfile): 
    text_file.write(row) 
    if row_num >= 20: 
     break 
text_file.close() 

könnten Sie dies weiter verbessern, indem with Blöcke mit Hilfe der Dateien zu öffnen, anstatt sie explizit zu schließen. Zum Beispiel:

with open(file_path, "rb") as csvfile: 
    #your code here involving csvfile 
#now the csvfile is closed! 

Beachten Sie auch, dass Python nicht das beste Werkzeug für das sein könnte - Sie kann es von Bash, zum Beispiel direkt tun konnten, mit nur head -n20 csvfile.csv > output.txt.

+0

Danke! Ich muss die ganze Datei lesen, da ich gerade mit einem kleinen Teil der Datei arbeite, um zu testen, wie es am besten zu parsen ist, da die Reihenfolge der Datei ein wenig unberechenbar ist, aber auf lange Sicht werde ich das Ganze brauchen Datei. Dies scheint nicht zu funktionieren, die Ausgabetextdatei ist noch leer. Ich werde das mit Blöcken versuchen. Auch ich muss Python für dieses Projekt verwenden. –

+0

@ Clíodhna der Code sollte funktionieren (außer Sie 'csvfile' nicht geschlossen). Schaust du dir das richtige Verzeichnis an? –

+0

Entschuldigung, ein bisschen Kopier- und Einfügefehler, ich habe die Zeile aktualisiert, die das Schreiben ausführt. –

1

Eine einfache Lösung nur tun würde:

#!/usr/bin/python 
# -*- encoding: utf-8 -*- 

file_path = './test.csv' 
with open(file_path, 'rb') as csvfile: 
    with open('output.txt', 'wb') as textfile: 
     for i, row in enumerate(csvfile): 
      textfile.write(row) 
      if i >= 20: 
       break 

Erläuterung:

with open(file_path, 'rb') as csvfile: 
with open('output.txt', 'wb') as textfile: 

Statt open und close verwenden, empfiehlt es sich, anstatt diese Zeile zu verwenden. Schreiben Sie einfach die Zeilen, die Sie ausführen möchten, wenn Ihre Datei auf eine neue Ebene der Einrückung geöffnet wird.

'rb' und 'wb' sind die Schlüsselwörter Sie eine Datei in jeweils 'reading' und 'writing' in 'binary mode'

for i, row in enumerate(csvfile): 

öffnen müssen Diese Zeile Sie Zeile für Zeile lesen können Ihre CSV-Datei und ein Tupel mit (i, row) gibt Ihnen sowohl der Inhalt der Zeile als auch der Index. Das ist eine der fantastischen eingebauten Funktionen von Python: Schauen Sie sich here für mehr darüber an.

Hoffe, das hilft!


EDIT: Beachten Sie, dass Python hat eine CSV package, die das ohne enumerate tun können:

# -*- encoding: utf-8 -*- 

import csv 

file_path = './test.csv' 
with open(file_path, 'rb') as csvfile: 
    reader = csv.reader(csvfile) 
    with open('output.txt', 'wb') as textfile: 
     writer = csv.writer(textfile) 
     i = 0 
     while i<20: 
      row = next(reader) 
      writer.writerow(row) 
      i += 1 

Alles, was wir verwenden müssen, ist seine reader und writer.Sie haben Funktionen next (die eine Zeile liest) und writerow (die einen schreibt). Beachten Sie, dass die Variable row hier keine Zeichenfolge, sondern eine Liste von Zeichenfolgen ist, da die Funktion den split-Job selbst ausführt. Es könnte schneller als die vorherige Lösung sein.

Auch hat dies den großen Vorteil, die Sie Blick ermöglicht überall in der Datei wollen, nicht unbedingt von Anfang an (nur die Grenzen für i ändern)

+1

Ich glaube nicht, dass '#!/Usr/bin/python 'notwendig ist (sie benutzen vielleicht virtualenv oder ein anderes Betriebssystem). –

+0

Ihr Kommentar macht durchaus Sinn, ich denke OP kann diese Zeile ohne Schaden auslassen. – BusyAnt

Verwandte Themen