2017-10-25 3 views
0

Ich habe zwei Programme, die genau das tun, was ich will. Ich versuche, sie zu einem einzigen Programm zusammenzufassen, und hier brauche ich Unterstützung.Lesen, verarbeiten und schreiben Sie eine Datei in Chunks

Programm # 1 liest eine ganze Datei, readlines(), verarbeitet sie und schreibt dann die Daten in eine neue Datei. Funktioniert perfekt.

Code:

datafile = "d:\\python\\workbook\\countries-raw.txt" 

with open(datafile, "r") as file: 
    content = file.readlines() 

content = [i.strip('\n') for i in content if '\n' in i] 
content = [i for i in content if i != ""] 
content = [i for i in content if i != "Top of Page"] 
content = [i for i in content if len(i) != 1] 

print(content) 

newfile = "d:\\python\\workbook\\countries-raw-2.txt" 

with open(newfile, "w") as file2: 
    for i in content: 
     file2.write(i + '\n') 

Programm # 2 liest eine Datei in Blöcken, X Zeilen gleichzeitig. Es druckt dann die Daten X Zeilen auf einmal. Es funktioniert auch genau wie beabsichtigt.

Code mit Beispielausgabe:

textfile = "d:\\mark\\python\\test.txt" 


def read_n(file, x): 
    with open(file, mode='r') as fh: 
     while True: 
      data = ''.join(fh.readline() for _ in range(x)) 

      if not data: 
       break 

      yield data 


for nlines in read_n(textfile, 5): 
    print(nlines) 

'''  
    abc 
    123 
    def 
    456 
    ghi 

    789 
    jkl 
    abc 
    123 
    def 

    456 
    ghi 
    789 
    jkl 
    abc 

    123 
    def 
    456 
    ghi 
    789 

    jkl 
    abc 
    123 
    def 
    456 

    ghi 
    789 
    jkl 
''' 

Was ich will, ist ihre Funktionalität zu kombinieren. Angenommen, ich muss eine Datei mit mehr als 20 Millionen (oder mehr) Zeilen Text verarbeiten. Ich kann möglicherweise nicht in der gesamten Datei einlesen und eine riesige Liste wie in Programm # 1 erstellen.

Doch dies scheint, wie es unnötig langsam sein würde:

liest in einer Zeile. Verarbeiten Sie die Linie. Schreiben Sie die Zeile. Wiederholen, bis die gesamte Datei verarbeitet wurde.

ich mein zweites Programm Denken Logik groß wäre hier:

lesen in X-Linien. Verarbeiten Sie alle X-Zeilen. Schreibe die Zeilen (darf nicht genau X sein, je nachdem, was ich gerade mache). Wiederholen, bis die gesamte Datei verarbeitet wurde.

Das ist, was ich habe, aber es funktioniert nicht: (. HINWEIS Sie den Inhalt in der Liste [content] korrekt sind nach dem letzten Verständnis verarbeitet wird)

textfile = "d:\\python\\workbook\\countries-raw.txt" 
newfile = "d:\\python\\workbook\\temp-2.txt" 

def read_n(file, x): 
    with open(file, mode='r') as fh: 
     while True: 
      data = ''.join(fh.readline() for _ in range(x)) 
      content = data.split('\n') 
      content = [i for i in content if i != ""] 
      content = [i for i in content if i != "Top of Page"] 
      content = [i for i in content if len(i) != 1] 

      if not content: 
       break 

      yield content 


for nlines in read_n(textfile, 50): 
    with open(newfile, "w") as file2: 
     for item in content: 
      content.write(item + '\n') 
    print(nlines) 

Zumindest ich eine Scoping-Ausgabe haben weil PyCharm sagt "Inhalt" ist unbekannt in der unteren Druckabteilung. Außerdem, wenn möglich, wenn die Datei geschrieben wird, möchte ich keine Leerzeichen zwischen den Daten, wie es in der Ausgabe von Programm # 2 erscheint.

Antwort

0

Habe ich es einfach aus:

for nlines in read_n(textfile, 50): with open(newfile, "a") as file2: for item in nlines: file2.write(item + '\n') print(nlines)

Verwandte Themen