2016-03-22 15 views
-2
`import fileinput 
f = open('file1', 'r') 
f1 = open('file2', 'w') 
f2 = open('file3', 'w') 
i=0 
for line in f:` 
    if i==0: 
     f1.write(line) 
     i=1 
    else: 
     f2.write(line) 
     i=0 
f1.close() 
f2.close()` 

Der Versuch mit diesem Code ergab mir kein Ergebnis.Auch meine Dateien haben Text, der über mehrere Zeilen verteilt ist.So wird das funktionieren?Wie schreibe ich alternative Zeilen in einer Textdatei in eine andere Textdatei in Python?

+0

brachte keine Ergebnis - Bedeutung, keine Ausgabe und keine Dateien erstellt? – TigerhawkT3

+0

Keine Zeilen wurden kopiert @ TigerhawkT3 – Keerthimanu

+1

Wurden die Dateien erstellt? Wenn ja, waren sie leer? Wenn nicht, sind Sie sicher, dass Sie das richtige Verzeichnis überprüfen? Gab es eine Fehlermeldung? – TigerhawkT3

Antwort

-1

Zuerst müssen Sie aus Sicherheitsgründen Ihre Datei stattdessen mit dem Schlüssel with öffnen. Selbst wenn Sie nicht an einem wichtigeren Projekt mit Ihrem eigentlichen Code arbeiten, ist es gut, so gute Programmiergewohnheiten zu haben.

Ich schlage vor, Sie einen einfachen Ansatz, Ihr Problem zu lösen:

  1. Lesen Sie die Datei readlines() Methode. Dies führt zu einer Liste, in der jede Zeile Ihrer Datei ein Element dieser Liste darstellt.

    with open('file.txt', 'r') as f: lines = f.readlines()

  2. Vorteil lines Liste nehmen, indem sie in zwei separate Listen Neuanordnung der ungeraden und geraden Linien:

    even_lines, odd_lines = lines[::2], lines[1::2]

  3. Schleife auf jeder Unterliste seine Zeilen in der Datei zu speichern Ihrer Wahl:

    with open('file1.txt','w') as f1: for odd_line in odd_lines: f1.write(odd_line)

    with open('file2.txt','w') as f2: for even_line in even_lines: f2.write(even_line)

Volles Programm:

Lassen Sie uns nur die oben genannten Teile des Codes in eine kleine Anwendung sammeln:

# Safely open your file 
with open('file.txt', 'r') as f: 
    lines = f.readlines() 

# Rearrange the lines according to the logic you are looking for 
even_lines, odd_lines = lines[::2], lines[1::2] 

# Safely open your files 
with open('file1.txt','w') as f1: 
    for odd_line in odd_lines: 
     f1.write(odd_line) 

with open('file2.txt','w') as f2: 
    for even_line in even_lines: 
     f2.write(even_line) 

Demo:

[email protected]:~/Desktop$ python tester.py 
[email protected]:~/Desktop$ cat file1.txt 
This is the line number 1 
This is the line number 3 
This is the line number 5 
[email protected]:~/Desktop$ cat file2.txt 
This is the line number 0 
This is the line number 2 
This is the line number 4 
[email protected]:~/Desktop$ 
-1

Da Dateiobjekte Lazy Iteration unterstützt (verhält sich effektiv als Generatoren), schlage ich vor, Generatorschnittstelle, nämlich next Funktion zu verwenden.

Rufen Sie das nächste Element vom Iterator ab, indem Sie seine next() -Methode aufrufen. Wenn der Standardwert angegeben ist, wird er zurückgegeben, wenn der Iterator erschöpft ist, andernfalls wird StopIteration ausgelöst.

with open('file1', 'r') as src, open('file2', 'w') as dst_odd, open('file3', 'w') as dst_even: 
    odd_line = next(src) 
    dst_odd.write(odd_line) 
    even_line = next(src) 
    dst_even.write(even_line) 

Sie brauchen auch EOF zu behandeln - so zu tun, können Sie StopIteration Ausnahme fangen.

with open('file1', 'r') as src, open('file2', 'w') as dst_odd, open('file3', 'w') as dst_even: 
    try: 
     odd_line = next(src) 
    except StopIteration: 
     pass # stop processing - end of file 
    dst_odd.write(odd_line) 
    try: 
     even_line = next(src) 
    except StopIteration: 
     pass # stop processing - end of file 
    dst_even.write(even_line) 

Zur weiteren Vervielfältigung in Code reduzieren und Fall für beliebige Anzahl von Ausgabedateien verallgemeinern Sie so etwas wie verwenden:

import itertools 
with open('file1', 'r') as src, open('file2', 'w') as dst_odd, open('file3', 'w') as dst_even: 
    destinations = itertools.cycle([dst_odd, dst_even]) # additional file object may be passed here. 
    try: 
     next_line = next(src) 
    except StopIteration: 
     pass # stop processing - end of file 
    next_dst = next(destinations) 
    next_dst.write(next_line) 
+0

Warum funktioniert der Algorithmus des OP nicht? Wie hilft das eigentlich überhaupt? – TigerhawkT3

0

Sie,

text = f.readlines() 

for line in text: 

versuchen kann ich annehmen, dass Sie nicht haben Sie "" Zeichen in Ihrem ursprünglichen Code.

+0

Unnötig und nicht hilfreich. – TigerhawkT3

+1

@ TigerhawkT3 Nicht mit dir streiten. Keerthimanu sagte, es käme nicht in die Schleife. Ich weiß nicht, welche Version er benutzt, aber offensichtlich geht es um "in f" -Teil. Ich glaube, dass Code auf diese Weise funktioniert. –

+1

Dateiobjekte können einfach über iteriert werden. Es gibt keinen Grund, dass dieser Vorschlag den geringsten Unterschied machen sollte (außer natürlich die Leistung zu reduzieren). – TigerhawkT3

Verwandte Themen