2012-04-17 7 views
10

ich in der Regel Dateien wie diese in Python lesen:Gibt es eine Möglichkeit, eine Datei in einer Schleife in Python mit einem Separator andere als Newline zu lesen

f = open('filename.txt', 'r') 
for x in f: 
    doStuff(x) 
f.close() 

Dies ist jedoch teilt die Datei durch Zeilenumbrüche. Ich habe jetzt eine Datei, die alle ihre Informationen in einer Zeile hat (45.000 Strings durch Kommas getrennt). Während eine Datei dieser Größe trivial ist bei der Verwendung etwas zu lesen wie

f = open('filename.txt', 'r') 
doStuff(f.read()) 
f.close() 

Ich bin gespannt, ob für eine viel größere Datei, die alle in einer Zeile wäre es möglich, einen ähnliche Iteration Effekt wie bei den ersten zu erreichen Code-Snippet, aber mit Komma statt Newline oder einem anderen Zeichen?

+0

Mögliches Duplikat von: . Lösung durch Unterklassenbildung des 'Datei'-Objekts wird dort gegeben. – ely

+0

ja das ist genau das was ich gesucht habe, danke! – vasek1

+0

Es ist im Allgemeinen eine gute Idee, Dateiobjekte zu schließen(), sobald Sie fertig sind. –

Antwort

8

Die folgende Funktion ist eine ziemlich einfache Art und Weise zu tun, was Sie wollen:

def file_split(f, delim=',', bufsize=1024): 
    prev = '' 
    while True: 
     s = f.read(bufsize) 
     if not s: 
      break 
     split = s.split(delim) 
     if len(split) > 1: 
      yield prev + split[0] 
      prev = split[-1] 
      for x in split[1:-1]: 
       yield x 
     else: 
      prev += s 
    if prev: 
     yield prev 

Sie würde es so verwenden:

for item in file_split(open('filename.txt')): 
    doStuff(item) 

Dieser schneller sein sollte als die Lösung, die EMS verbunden, und spart eine Menge Speicher über das Lesen der gesamten Datei auf einmal für große Dateien.

+0

Muss bufsize so groß sein wie das Element selbst oder nur das Trennzeichen? – sashoalm

1

Öffnen Sie die Datei mit open(), und verwenden Sie dann die Methode file.read(x), um (ungefähr) die nächsten x Bytes aus der Datei zu lesen. Sie könnten Blöcke von 4096 Zeichen anfordern, bis Sie das Ende der Datei erreicht haben.

Sie müssen die Aufteilung selbst implementieren - Sie können sich von dem Modul csv inspirieren lassen, aber ich glaube nicht, dass Sie es direkt verwenden können, da es nicht für extrem lange Leitungen ausgelegt ist.

+1

Sie können dies mit einem Dateiobjekt auf Python 2 oder 3 tun. Kein Grund, 'io' zu verwenden. Um es klar zu sagen, ein Dateiobjekt erhält man, wenn man 'open' aufruft. Verwenden Sie nicht die eigentliche eingebaute 'Datei'. – agf

+0

@agf - bearbeitet. Besser? –

Verwandte Themen