15

このPythonプログラムで「IOError:[Errno0]Error」というエラーが発生しました。

from sys import argv
file = open("test.txt", "a+")
print file.tell() # not at the EOF place, why?
print file.read() # 1
file.write("Some stuff will be written to this file.") # 2
# there r some errs when both 1 & 2
print file.tell()
file.close()

問題であると想定されるのは?以下の2つのケースは問題ありません。

from sys import argv
file = open("test.txt", "a+")
print file.tell() # not at the EOF place, why?
# print file.read() # 1
file.write("Some stuff will be written to this file.") # 2
# there r some errs when both 1 & 2
print file.tell()
file.close()

と:

from sys import argv
file = open("test.txt", "a+")
print file.tell() # not at the EOF place, why?
print file.read() # 1
# file.write("Some stuff will be written to this file.") # 2
# there r some errs when both 1 & 2
print file.tell()
file.close()

それでも、なぜ

print file.tell() # not at the EOF place, why?

ファイルのサイズを出力しません。「a+」は追加モードですか?次に、ファイルポインタはEOFを指す必要がありますか?

私はWindows7とPython2.7を使用しています。

4

2 に答える 2

13

Python は stdio の fopen 関数を使用し、モードを引数として渡します。@Lev は Linux でコードが正常に動作すると言っているので、Windows を使用していると仮定しています。

以下は、Windows のfopenドキュメントからのものです。これは、問題を解決する手がかりになる可能性があります。

"r+"、"w+"、または "a+" アクセス タイプが指定されている場合、読み取りと書き込みの両方が許可されます (ファイルは "更新" のために開かれていると言われます)。ただし、読み取りと書き込みを切り替えるときは、間に fflush、fsetpos、fseek、または巻き戻し操作が必要です。必要に応じて、現在の位置を fsetpos または fseek 操作で指定できます。

したがって、解決策は呼び出しfile.seek()の前に追加することです。file.write()ファイルの末尾に追加するには、file.seek(0, 2).

参考までに、file.seek は次のように動作します。

ファイル オブジェクトの位置を変更するには、f.seek(offset, from_what) を使用します。位置は、基準点にオフセットを追加して計算されます。基準点は from_what 引数によって選択されます。from_what の値が 0 の場合はファイルの先頭から測定され、1 の場合は現在のファイル位置が使用され、2 の場合はファイルの末尾が基準点として使用されます。from_what は省略可能で、デフォルトは 0 で、ファイルの先頭を基準点として使用します。

【参考:http://docs.python.org/tutorial/inputoutput.html】

コメントで @lvc が、回答で @Burkhan が述べたように、io モジュールの新しい open 関数を使用できます。ただし、この場合、書き込み関数はまったく同じように機能しないことを指摘したいと思います-入力としてユニコード文字列を提供する必要があります[uあなたの場合、文字列に a をプレフィックスするだけです]:

from io import open
fil = open('text.txt', 'a+')
fil.write('abc') # This fails
fil.write(u'abc') # This works

最後に、'file' という名前を変数名として使用しないでください。これは、組み込みの型を参照し、警告なしで上書きされ、エラーを見つけにくくなる可能性があるためです。

于 2012-06-24T10:42:13.467 に答える
6

解決策はから使用することopenですio

D:\>python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('file.txt','a+')
>>> f.tell()
0L
>>> f.close()
>>> from io import open
>>> f = open('file.txt','a+')
>>> f.tell()
22L
于 2012-06-24T11:41:00.267 に答える