2017-07-22 6 views
0

初心者にはあなたの助けが必要です。私はtxtファイルリストの列の名前を変更しようとしたときに問題に悩まされています。 私は列クローズファイルエラー(Python2)のI/O操作

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

の名前を変更するためにパンダをインポートしかし、私は常にエラー "閉じられたファイルのI/O操作" を取得した後、それをリネームする前に、私はスペースに

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

を削除します。私が知っているように、ブロックが自動的にファイルを閉じるが、どこに問題があるのか​​、私は本当に見ることができない。

編集:ここでは @COLDSPEED

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

の貢献とリネーム列

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 

うち左側空間と、リストの最終的な結果のための第二部(と私の働いていたコードがあります前にあった)と列名

enter image description here

+0

あなたのコードが間違って何尋ねる前に、まず自分のインデントを修正してください。 – zwer

+0

スクリプトではすでにインデントされていましたが、貼り付けると残念ですが、インデントが消えました。 –

答えて

2

sys.stdoutを変更してプリントするとが間違っていますあなたは不可逆的な損傷を引き起こすため、これについてはお気付きください。

問題は、コンテキストマネージャ内のファイルポインタに再割り当てするために発生します。 withブロックを終了すると、マネージャは自動的に閉じます。sys.stdoutは閉じたファイルを指しています。そのため、そのエラーが発生します。

2つの選択肢があります。最初のオプションは、sysをリロードして問題を解決することです。あなたはそれを行うことができます

import imp 
imp.reload(sys) 

第2の、より良いオプション(私が好む)は、この状況にまったく関与しないことです。 Python2のprint文を使用すると、フープを介してジャンプすることなく、リダイレクトすることができます構文は次のとおりです。

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

または、若干良い:

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

ごめんなさい。私は 'n.write(line)'がより効率的だと言っていたはずです。それはそうです。 :)私は混乱のために謝罪します。 –

+0

@JohnZwinckああ、私は今あなたを得る。編集してありがとう:) –

+0

@ COLDSPEED sys.stdoutとprint >> nの良い点をありがとう、line.strip()は私にとって素晴らしいソリューションです。多くのありがとう –

関連する問題