2012-06-25 5 views
14
text_file = open("new.txt", "r") 

lines = text_file.readlines() 

for line in lines: 
     var1, var2 = line.split(","); 
     myfile = open('xyz.txt', 'w') 
     myfile.writelines(var1) 
     myfile.close() 
text_file.close() 

Ich habe 10 Zeilen Text in new.txt wie Adam: 8154 George: 5234 und so weiter. Jetzt möchte ich eine Textdatei, die nur die Namen enthält. xyz.txt muss Adam George und so weiter enthalten. Der obige Code hinterlässt nur den 10. Namen.Schreiben in eine Datei in einem for-Schleife

Wie Sie alle 10 Namen in einer einzigen Textdatei haben.

Antwort

21

Das liegt daran, dass Sie öffnen, Schreiben und Schließen der Datei 10 Mal in Ihrem for-Schleife

myfile = open('xyz.txt', 'w') 
myfile.writelines(var1) 
myfile.close() 

Sie sollten Ihre Datei außerhalb for-Schleife öffnen und schließen.

myfile = open('xyz.txt', 'w') 
for line in lines: 
    var1, var2 = line.split(","); 
    myfile.write("%s\n" % var1) 

myfile.close() 
text_file.close() 

Sie sollten auch zu Verwendung bemerken und nicht writelines schreiben.

writelines schreibt eine Liste von Zeilen in Ihre Datei.

Auch sollten Sie die Antworten von Leuten hier geschrieben, die with Anweisung verwendet. Das ist die elegante Art, Datei-Lese-/Schreiboperationen in Python auszuführen

+1

Oder verwenden Sie 'with' vor der Schleife zu schließen. –

+0

es hat keine Änderung am Ergebnis vorgenommen – h4r5h4

+0

ja, wollte ihn zuerst das Problem verstehen lassen. Danke – pyfunc

11

Das Hauptproblem war, dass Sie Dateien wiederholt innerhalb Ihrer Schleife öffneten/schlossen.

versuchen, diesen Ansatz:

with open('new.txt') as text_file, open('xyz.txt', 'w') as myfile: 
    for line in text_file: 
     var1, var2 = line.split(","); 
     myfile.write(var1+'\n') 

Wir öffnen beiden Dateien auf einmal, und weil wir with verwenden, werden sie automatisch geschlossen sein, wenn wir (oder eine Ausnahme auftritt) durchgeführt werden. Zuvor wurde Ihre Ausgabedatei wiederholt in Ihrer Schleife geöffnet.

Wir verarbeiten auch die Datei Zeile für Zeile, anstatt alle davon in den Speicher sofort zu lesen (was ein Problem sein kann, wenn Sie mit wirklich großen Dateien umgehen).

Beachten Sie, dass write() kein Newline anhängen ('\n'), so dass Sie werden feststellen, dass selbst zu tun haben, wenn Sie es brauchen (ich Ihre writelines() mit write() ersetzt, wie Sie ein einzelnes Element schreiben, nicht eine Liste der Elemente) .

Beim Öffnen einer Datei für r lesen, ist die 'r' optional, da es der Standardmodus ist.

+0

Vielen Dank – h4r5h4

+0

@Levon: +1 Danke für diese Korrektur – pyfunc

5

Es ist vorzuziehen, Kontext-Manager zu verwenden, um die Dateien automatisch

with open("new.txt", "r"), open('xyz.txt', 'w') as textfile, myfile: 
for line in textfile: 
    var1, var2 = line.split(","); 
    myfile.writelines(var1) 
+0

Ich wusste, dass Sie mehrere Dateien mit 'mit' öffnen könnten (ich mache das gleiche oben), aber ich kannte dieses Format nicht mit den Dateivariablen am Ende .. etwas Neues gelernt, ordentlich. – Levon