1

Windows 7 と Python 2.7.3 を使用しています。

PS C:\Python27\LearnPythonTheHardWay> python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> input = open('file_operation_sample.txt', 'a+')
>>> print input.tell()  # first 'tell()'
0
>>> input.write(u'add')
>>> print input.tell()
12
>>> input.seek(0)
>>> print input.read()
123456789add
>>> input.close()
>>>

tell()最初の出力がなぜ0出力されると思ったのか、とても困惑してい9ます。'a+' は追加モードで、ファイル ポインタは EOF にある必要があります。そして、最終的に文字列「abc」が「123456789」に追加されたことにさらに困惑していますか?

別の質問、

PS C:\Python27\LearnPythonTheHardWay> python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> from io import open
>>> input = open('file_operation_sample.txt', 'a+')
>>> print input.tell()
9
>>> input.write(u'add')
3L
>>> print input.tell()
12
>>> input.seek(2)
2
>>> input.seek(2, 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: can't do nonzero cur-relative seeks
>>>

どうしたの?コメントアウトすればfrom io import openOKです。

4

1 に答える 1

1

Python の動作はtell()C と同じftell()です。ここのドキュメントには次のように記載されています。

データを追加するためにファイルが開かれる場合、現在のファイル位置は、次の書き込みが発生する場所ではなく、最後の I/O 操作によって決定されることに注意してください。

それはあなたの最初の教えがなぜであるかを説明するでしょう0-あなたはまだファイルI / Oを行っていません。


これがイラストです。まず、ファイルに 5 文字を書き込みます。予想どおり、書き込みは at で開始され、完了した時点0でファイル ポインターは at5になります。

>>> with open('test.txt', 'w') as fh:
    fh.write('12345')
    fh.tell()

5L 

次に、追加するためにそれを開きます。私たち0はあなたが見つけたものから始めます。しかし、今はread()ファイルから を実行しており、驚くことではありませんが、 から読み始めてい0ます。読み取り後、ファイル ポインタは に移動しました5

>>> with open('test.txt', 'a+') as fh:
    fh.tell()
    fh.read()
    fh.tell()

0L
'12345'
5L

では、追加用にファイルを開いて、今度は書き込みを行いましょう。ドキュメントに記載されているように、書き込みの前に、ファイル ポインターはファイルの末尾に移動されます。0そのため、ファイル ポインターが書き込みの前にあったとしても、古いバイトの後に新しいバイトを取得します。

>>> with open('test.txt', 'a+') as fh:
    fh.tell()
    fh.write('abc')
    fh.tell()
    fh.seek(0)
    fh.read()

0L
8L
'12345abc'

Python のドキュメントでseek()も、この動作が示唆されています。

ファイルが追加用に開かれている場合 (モード 'a' または 'a+')、seek() 操作は次の書き込みで取り消されることに注意してください。

于 2012-07-02T15:36:38.433 に答える