2017-07-22 1 views
0

Ich brauche deine Hilfe als Neuling. Ich stehe in einem Problem fest, während ich versuche, die Spalte in einer TXT-Dateiliste umzubenennen. Bevor es umbenennen, entferne ich den RaumE/A-Vorgang bei geschlossenem Dateifehler (Python2)

with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n: 
sys.stdout=n 
for line in m: 
    print line.strip() 

Nachdem ich Pandas importieren Spalte

import pandas as pd 
df=pd.read_csv("smpl.txt", sep=" ", header=None, names=["a","b","c","d"]) 
print (df) 

umbenennen Aber ich bekomme ständig "I/O-Operation auf geschlossene Datei" Fehler. Wie ich weiß, mit Block automatisch schließen Sie die Datei, aber wo ist das Problem, ich kann wirklich nicht sehen.

Edit: Hier ist mein gearbeitet Code mit Beitrag von @COLDSPEED

with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n: 
for line in m: 
    n.write(line.strip()+"\n") 

und den zweiten Teil für die Umbenennung Spalten

import pandas as pd 
with open ("smp.txt", "w") as r: 
    df=pd.read_csv("smpl.txt", sep=" ", header=None, names=["a","b","c","d"]) 
    print>> r, df 

Das Endergebnis der Liste mit aus linkem Raum (Es gab vorher) und mit Spalte Name

enter image description here

+0

Sie bitte Ihren Einzug fixiert, bevor die Frage, was mit Ihrem Code falsch ist. – zwer

+0

Es war bereits richtig im Skript eingerückt, aber es tut mir so leid, als ich es eingefügt habe, verschwanden die Einrückungen. –

Antwort

2

Ändern sys.stdout zu Umleitung mit Druck ist die falsche Weg, um darüber zu gehen, weil Sie irreversiblen Schaden verursachen werden.

Das Problem tritt auf, weil Sie es einem Dateizeiger innerhalb des Kontextmanagers neu zuweisen. Nach dem Verlassen der with Block, schließt der Manager automatisch, so sys.stdout zeigt auf eine geschlossene Datei, weshalb Sie diesen Fehler erhalten.

Sie haben 2 Möglichkeiten. Die erste Möglichkeit besteht darin, das Problem durch erneutes Laden von sys zu beheben. Das können Sie tun mit

Die zweite und bessere Option (die ich bevorzuge) ist, überhaupt nicht in diese Situation zu kommen. Python2 die print-Anweisung hat eine Syntax, die Sie mit umleiten können, ohne durch Reifen springen:

with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n: 
    for line in m: 
     print >> n, line.strip() 

Oder etwas besser:

with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n: 
    for line in m: 
     n.write(line.strip() + '\n') 
+0

Sorry natürlich. Ich hätte sagen sollen: 'n.write (line)' ist effizienter. Und es ist . :) Ich entschuldige mich für das Verwechseln. –

+0

@JohnZwinck Ah, ich verstehe dich jetzt. Bearbeitet und danke :) –

+0

@ COLDSPEED Vielen Dank für Ihren guten Punkt auf sys.stdout und print >> n, line.strip() ist so eine tolle Lösung für mich. Vielen Dank –