2015-02-24 2 views
8

Um eine Datei von Linien durchlaufen, kann man tun -Pythonic Weg durch eine Datei auf etwas iterieren andere als Zeilenumbrüche

for line in f: 

(wobei f die Datei Iterator).

Ich möchte die Datei durch Blöcke, die durch Kommas getrennt sind, statt durch Blöcke, die durch Zeilenumbrüche getrennt sind, iterieren. Ich kann alle Zeilen lesen und dann die Zeichenfolge in Kommas aufteilen, aber was ist der pythonische Weg, dies zu tun?

Antwort

3

Iterate über die Spaltung, wie Sie gehen, dann müssen Sie nicht alle Linien speichern:

for line in f: 
    for lines in line.split(","): 
+1

Vielen Dank für die Antwort! – Illusionist

+4

Denken Sie über den Fall nach, in dem ein Zeilenumbruch zwischen zwei Kommas steht. – thefourtheye

+1

@ Illusionist, keine Sorgen. Dies erspart Ihnen das Speichern aller Zeilen und der Teilzeilen im Speicher, was für eine große Datei ein Problem darstellen könnte. –

2

Verwenden Zeichenfolge split() Methode durch Komma Inhalt zu teilen.

z.B.

input_file = "/home/vivek/Desktop/Work/stack_over/href_input.html" 
#- Read File content. 
with open(input_file, "rb") as fp: 
    content_list = fp.read().split(",") 

Iterate Datei Zeile für Zeile und jede Zeile iterieren durch

Komma spiting
>>> with open(input_file, "rb") as fp: 
... for f in fp: 
...  for i in f.split(","): 
...   i 
+1

Dies macht den ganzen Punkt des Iterierens über das Dateiobjekt zunichte. Denken Sie an eine Datei, die doppelt oder dreimal so groß wie der Speicher Ihres Systems ist. – thefourtheye

+0

@thefourtheye Ist das nicht der 0,1% Fall? Wie oft denkst du, dass das schief gehen wird, wenn du nicht genug RAM hast? –

+0

@thefourtheye: ja, aber wir lesen Datei Zeile für Zeile, dann wird es nicht Komma getrennt. –

0

Wenn Sie wirklich einen Riesen (zB 1 TB) durch Trennzeichen einzeilige Datei und Prozesselemente müssen scannen, können Sie Lesen Sie Datei für Blöcke, teilen Sie sie auf und bearbeiten Sie die Randeffekte. Hier ist ein Generator, der dabei helfen kann:

def split_file(file, delim, block_size=1024*1024): 
    block = True 
    last_item = '' 
    while block: 
     block = file.read(block_size) 
     items = block.split(delim) 
     for i in xrange(len(items)-1): 
      item = items[i] 
      if last_item: 
       yield last_item + item 
       last_item = '' 
       continue 
      if item: 
       yield item 
     last_item += items[-1] 

Sie einfach es wie folgt verwenden können:

f = open("names.in.txt") 
for name in split_file(f, ","): 
    print name # process one item there 
Verwandte Themen