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]
Vielen Dank :) –