2017-08-27 2 views
2

私はMacOS Sierra 10.12.16とXcode 8.3.3でPythonバージョン2.7.10を使用しています デモプログラムでは、ファイルに2行のテキストを書きたいと思います。 これは2つのステップで行う必要があります。最初のステップでは、メソッドopenNewFile()が呼び出されます。ファイルはopenコマンドで作成され、1行のテキストがファイルに書き込まれます。ファイルハンドルは、メソッドの戻り値です。 第2ステップでは、ファイルハンドルfHを入力引数とするメソッドcloseNewFile(fH)が呼び出されます。 2行目のテキストをファイルに書き込む必要があり、ファイルを閉じる必要があります。ただし、これにより、エラーメッセージが表示されます。Pythonは単一のwrite()の後にファイルを閉じます

Traceback (most recent call last): 
    File "playground.py", line 23, in <module> 
    myDemo.createFile() 
    File "playground.py", line 20, in createFile 
    self.closeNewFile(fH) 
    File "playground.py", line 15, in closeNewFile 
    fileHandle.writelines("Second line") 
ValueError: I/O operation on closed file 
Program ended with exit code: 1 

ファイルを1つの方法から別の方法に処理することが問題になる可能性があります。

#!/usr/bin/env python 
import os 

class demo: 
    def openNewFile(self): 
     currentPath = os.getcwd() 
     myDemoFile = os.path.join(currentPath, "DemoFile.txt") 
     with open(myDemoFile, "w") as f: 
      f.writelines("First line") 
      return f 

    def closeNewFile(self, fileHandle): 
     fileHandle.writelines("Second line") 
     fileHandle.close() 

    def createFile(self): 
     fH = self.openNewFile() 
     self.closeNewFile(fH) 

myDemo = demo() 
myDemo.createFile() 

私は間違っていますか? この問題を解決するにはどうすればよいですか?

+0

ファイルを開く/閉じるコードを提供できますか? – AK47

+0

open()で使用すると、コンテキストマネージャは自動的にファイルを閉じます – AK47

答えて

10

あなたはwith....asのことを間違えています。このコードはここに犯人である:

with open(myDemoFile, "w") as f: 
    f.writelines("First line") 
    return f 

ちょうど戻る前に、withファイルを閉じ、あなたが関数から閉じられたファイルを返してしまいます。

ファイルを1つの関数で開き、それを閉じずに返す必要があります(実際の意図は何ですか)は、メジャーコードの匂いです。それによると、この問題に対する修正はwith...asコンテキストマネージャを取り除くために次のようになります。

f = open(myDemoFile, "w") 
f.writelines("First line") 
return f 

はこれまで改善がにあなたのコンテキストマネージャを取り除くないことだろうが、すべてを実行するためにあなたのI/O 内のコンテキストマネージャ。オープンと書き込みのために別々の機能を持たず、I/O操作を分割しないでください。

関連する問題