2016-05-25 2 views
1

Die Datei wie eine Reihe mit IDs von Zeilen schreiben:Hallo Ich habe einen Code, das druckt, was ich in Python brauchen, aber ich möchte es dieses Ergebnis in eine neue Datei Blick

aaaa 
aass 
asdd 
adfg 
aaaa 

Ich würde wie in einer neuen Datei die ID und ihr Auftreten in der alten Datei als Form zu erhalten:

aaaa 2 
asdd 1 
aass 1 
adfg 1 

Mit dem 2-Elemente durch Tab getrennt.

Der Code i drucken, was ich will, aber in einer neuen Datei nicht schreiben:

with open("Only1ID.txt", "r") as file: 
    file = [item.lower().replace("\n", "") for item in file.readlines()] 
     for item in sorted(set(file)): 
      print item.title(), file.count(item) 

Antwort

1

Wie Sie Python 2 verwenden, der einfachste Ansatz Konsole Ausgabe zu konvertieren Ausgabe in Datei ist durch die Verwendung von Druck Chevron (>>) Syntax, die die Ausgabe in eine beliebige Datei-ähnliches Objekt umleitet:

with open("filename", "w") as f: # open a file in write mode 
    print >> f, "some data"  # print 'into the file' 

Ihr Code wie folgt aussehen könnte nach einfach eine andere open hinzufügen der Ausgabedatei zu öffnen und hinzufügen ing den Sparren auf Ihre print Aussage:

with open("Only1ID.txt", "r") as file, open("output.txt", "w") as out_file: 
    file = [item.lower().replace("\n", "") for item in file.readlines()] 
    for item in sorted(set(file)): 
     print >> out_file item.title(), file.count(item) 

jedoch Ihren Code ein paar andere mehr oder weniger schlechte Dinge hat, die man nicht tun sollte oder verbessern könnte:

  • Verwenden Sie nicht die gleiche Variable Geben Sie file für das von open zurückgegebene Dateiobjekt und die verarbeitete Liste der Zeichenfolgen ein. Das ist verwirrend, benutze einfach zwei verschiedene Namen.

  • Sie können direkt über das Dateiobjekt iterieren, das wie ein Generator funktioniert und die Zeilen der Datei als Zeichenfolgen zurückgibt. Generatoren verarbeiten Anfragen für das nächste Element gerade rechtzeitig, das heißt, es lädt nicht zuerst die ganze Datei in den Speicher wie file.readlines() und verarbeitet sie danach, sondern liest und speichert immer nur eine Zeile nach der anderen, wenn die nächste Zeile benötigt wird. Auf diese Weise verbessern Sie die Leistung und Ressourceneffizienz des Codes.

  • Wenn Sie ein Listenverständnis schreiben, aber das Ergebnis nicht notwendigerweise als Liste benötigen, weil Sie es einfach mit einer for Schleife durchlaufen wollen, ist es effizienter, einen Generatorausdruck zu verwenden (gleicher Effekt wie die Datei) Objektliniengenerator, wie oben beschrieben). Der einzige syntaktische Unterschied zwischen einem Listenverständnis und einem Generatorausdruck sind die Klammern. Ersetzen Sie [...] durch (...) und Sie haben einen Generator. Der einzige Nachteil eines Generators besteht darin, dass Sie weder seine Länge ermitteln können, noch direkt über einen Index auf Elemente zugreifen können. Da Sie keine dieser Funktionen benötigen, ist der Generator hier in Ordnung.

  • Es gibt eine einfachere Möglichkeit, nachgestellte Zeilenumbruchzeichen aus einer Zeile zu entfernen: line.rstrip() entfernt alle nachfolgenden Leerzeichen. Wenn Sie z.B. Leerzeichen, aber nur die Newline entfernt werden soll, übergeben Sie dieses Zeichen als Argument: line.rstrip("\n").

    Es könnte jedoch noch einfacher und schneller sein, einfach keinen weiteren impliziten Zeilenumbruch während des Aufrufs print hinzuzufügen, anstatt ihn zuerst zu entfernen, damit er später wieder hinzugefügt wird.Sie würden den Zeilenumbruch von print in Python 2 durch einfaches Hinzufügen eines Kommas am Ende der Anweisung unterdrücken:

    print >> out_file item.title(), file.count(item), 
    
  • Es ist ein Typ Counter zu Vorkommen von Elementen in einer Sammlung zu zählen, die schneller und einfacher als Sie es selbst schreiben, weil Sie für jedes Element den zusätzlichen Aufruf count() nicht benötigen. Die Counter verhält sich meist wie ein Wörterbuch mit Ihren Gegenständen als Schlüssel und deren Anzahl als Werte. importieren Sie es einfach aus dem collections Modul und verwenden Sie es wie folgt aus:

    from collections import Counter 
    c = Counter(lines) 
    for item in c: 
        print item, c[item] 
    

Mit all diesen Vorschlägen (mit Ausnahme der nicht die Zeilenumbrüche zu entfernen) angelegt und die Variablen, um etwas mehr klar, die optimierte umbenannt Code sieht so aus:

from collections import Counter 
with open("Only1ID.txt") as in_file, open("output.txt", "w") as out_file: 
    counter = Counter(line.lower().rstrip("\n") for line in in_file) 
    for item in sorted(counter): 
     print >> out_file item.title(), counter[item] 
+0

Vielen Dank :) –

Verwandte Themen