2016-08-02 31 views
-1

Ich habe Textdateien, die wie folgt aussehen:Sortieren und Schreiben von Dateien in Python

2.8  3.0 1 
28.4 3.0 1 
36.2 3.0 1 
70.49 3.0 1 
85.19 3.0 1 

Und ich habe den folgenden Code:

f = open('file.txt','r') 

with open('file.txt') as fin: 
    lines = f.readline() 
print lines 
with open ('file_1.txt', 'w') as fout: 
    fout.write(lines) 

with open ('file.txt') as fin:  
    lines = f.readlines()[0:] 
print lines 
with open ('file_2.txt', 'w') as fout: 
    for el in lines: 
     fout.write('{0}\n'.format(' '.join(el))) 
f.close() 

Diese gibt file1 mit den Zahlen in der ersten Zeile. Und gibt dann file2 mit der Liste der verbleibenden Nummern aus. Wie kann ich dies dazu bringen, über Zeilen zu iterieren, damit die nächste Datei bei Zeile 2 beginnt und so weiter? Im Wesentlichen durchlaufen alle 40 Zeilen und entfernen Sie eine Zeile jedes Mal, wenn es eine Datei ausgibt.

Vereinfacht gesagt, ich möchte es Ausgabe:

  • file1 = line1 nur

  • Datei2 = Zeilen 2 bis 40

und dann ..

  • file3 = nur Zeile2

  • file4 = lines1 und 3 bis 40

..und so weiter

ich Python neu bin so wird jede Hilfe sehr geschätzt!

+3

Formatieren Sie Ihren Code. Was du hier gepostet hast, wird überhaupt nicht laufen. Ich kann raten, was du meintest, aber ich möchte es lieber nicht. Bitte repariere. –

+0

Warum müssen Sie die Eingabe mehrmals lesen, um dies zu tun? Lies es nur einmal und schreibe in den Kombinationen, die du willst. Lesen Sie auch über Schleifen, bevor Sie etwas Ähnliches versuchen. –

+0

Tun Sie nicht 'f = öffnen ('file.txt', 'r')' wenn Sie 'mit ...' machen wollen. –

Antwort

0

Hier ist eine Lösung mit der with Kontextverwaltung und readlines/writelines zur Vereinfachung der E/A.

with open('file.txt', 'r') as input: 
    linebuf = input.readlines() 
# The context manager will automatically close `input` 
# no matter what happens (including errors) 

for ind, line in enumerate(linebuf): 
    with open('file.line_{}_only.txt'.format(ind + 1), 'w') as output: 
     output.writelines([line]) 
    # Files named like "file.line_1_only.txt" will be closed here 
    with open('file.lines_except_{}.txt'.format(ind + 1), 'w') as output: 
     output.writelines(linebuf[:ind] + linebuf[ind + 1:]) 
    # Files named like "file.lines_except_1.txt" will be closed here 
+0

@AmnaAli. Das ist mein Code, nicht der andere. Es gibt zwei Antworten. Ich glaube, dass meins tut, was du willst. –

+0

Danke @MadPhysicist! Das funktioniert perfekt :) – User8732736

0

Sie können herausfinden, wie lang die Datei mit len ​​() ist und dann zwei For-Schleifen verwenden, um jedes Mal eine neue Textdatei zu durchlaufen und zu erstellen.

# Ask how long the file is 
with open("file.txt", "r+b") as text_file: 
    lines = text_file.readlines() # returns a list of the lines in the file 
num_lines = len(lines) 

# Now use two for loops to iterate 
for line in range(num_lines): 
    new_filename = "file_"+str(line)+".txt" 
    new_file = open(new_filename, "w") 
    for item in lines[line:]: 
     new_file.write("%s\n" % item) 
    new_file.close() 

Dies sollte eine neue Datei mit einem eindeutigen Dateinamen erzeugen. Jede Datei enthält eine Zeile weniger als die vorherige Datei.

+0

Danke @bobo! Das sieht so aus, als würde es tun, was ich brauche. Aber sein Absturz bei 'line8 'für Zeile in num_lines:' Sprich' int-Objekt ist nicht iterierbar '. Irgendeine Idee, was das verursacht? – User8732736

+0

Ersetze 'text_file = open (" file.txt "," r + b ")' mit 'mit open (" file.txt "," r + b ") als text_file:', ziehe die nächsten zwei Zeilen ein und werde los von 'text_file.close() '. –

+0

Auch 'für Zeile in num_lines' sollte' für Zeile im Bereich (num_lines): 'sein. –