4

現在、独学で Python を学んでおり、既存のファイルからのテキストの読み取りと追加の両方を行うスクリプトを作成して、ファイル I/O を学習しています。スクリプトは、write() メソッドを呼び出すまで実行されます。その時点で、特定されていない例外がスローされます。これがトレースバックです。

            File "test.py", line 13, in <module>
                f.write(txt)
            IOError: [Errno 0] Error

私のコード:

            from sys import argv

            script, filename = argv

            f = open(filename, 'a+')

            print("The contents of %s are:") % filename

            print f.read()

            txt = raw_input("What would you like to add? ")

            f.write(txt)

            print("The new contents are:")

            print f.read()

            f.close()

私の環境は、Win7、PowerShell、および Notepad++ の Python 2.7.3 です。

これは何が原因ですか?どうすれば修正できますか?私の理解では、a+アクセスモードにより、ファイルの読み取りと追加の両方が可能になるはずです。アクセス モードを に変更するr+と、同じ例外が発生します。

説明:

  • 次のように、スクリプトに引数として渡す単一の単語を含む既存のテキスト ファイル (a.txt) があります。

            python test.py a.txt
    
  • 私は Windows の管理者アカウントを使用しています。

結果:

少なくとも 2 つのseek()コマンドを追加すると、問題が修正されます。詳細については、回答の投稿を参照してください。

4

2 に答える 2

1

モードでファイルを開いた場合、何らかの理由print f.read()で OS X で動作しません。a+

Max OS X では、オープン モードを に変更し、2 番目の読み取りの前に行r+を追加すると機能します。f.seek(0)残念ながら、これは Windows では役に立ちません。

これは Mac OS で動作するコードです。

from sys import argv

script, filename = argv

f = open(filename, 'r+')

print("The contents of %s are:") % filename

print f.read()

txt = raw_input("What would you like to add? ")

f.write(txt)

print("The new contents are:")

f.seek(0)
print f.read()

f.close()

これは、Windows 7で動作させる唯一の方法です。

from sys import argv

script, filename = argv

f = open(filename, 'r')

print("The contents of %s are:") % filename

print f.read()
f.close()

txt = raw_input("What would you like to add? ")

f = open(filename, 'a')
f.write(txt)
f.close()
f = open(filename, 'r')

print("The new contents are:")

print f.read()

f.close()

これは非常にハッキーに思えます。これは Mac OS X でも動作するはずです。

于 2012-12-13T00:15:18.120 に答える
1

小さなサイズのテキストを追加しようとすると問題が発生します。テキストがバッファに残り、さらにデータを受信した後、実際の書き込みが完了する前にテキストが保持されます。
で、本当に書いてあることについてはドキュメントに書いてある通りにしてos.fsync()flush()

ちなみに、withステートメントを使用することをお勧めします。

そして、バイナリモードを使用する方がさらに優れています。あなたの場合、読み取り後にテキストを追加して使用するだけなので、問題はないはずですseek(o,o)。しかし、ファイルのポインターをファイルのバイトに正しく移動したい場合は、バイナリモードを使用することが絶対に必要です [ 'b'in open(filename, 'rb+') ]

私は個人的に を使用'a+'したことがなく、その効果が何であるかを理解したことがありません。

from sys import argv
from os import fsync

script, filename = argv

with open(filename, 'rb+') as f:
    print("The contents of %s are:") % filename
    print f.read()

    f.seek(0,2)
    txt = raw_input("What would you like to add? ")
    f.write(txt)
    f.flush()
    fsync(f.fileno())

    f.seek(0,0)
    print("The new contents are:")
    print f.read()
于 2012-12-13T00:58:07.560 に答える