3

私は現在、python-fuseを使用してファイルシステムを作成しており、さまざまなモード(「r」、「r +」など)ごとにファイルポインターがどこから始まるかを調べていましたが、ファイルポインターがゼロから始まる複数のサイトで見つかりました。ファイルの末尾から開始すると、'a' または 'a+' で開かれます。

これをPythonでテストして確認しました(各モードでテキストファイルを開き、すぐにtell()を呼び出しました)が、「a +」で開いたときに、ファイルポインターがファイルの終わりではなくゼロであることがわかりました。

これはpythonのバグですか、それともウェブサイトが間違っていますか?

参考のため:

4

3 に答える 3

5

いいえ、バグではありません。

データを書き込んtell() だ後に呼び出すとどうなりますか?

位置 0 に書き込みますか、それとも予想どおりファイルの最後に書き込みますか? 私はそれが後者であることに私の人生をほとんど賭けるでしょう。

>>> f = open('test', 'a+')
>>> f.tell()
0
>>> f.write('this is a test\n')
>>> f.tell()
15
>>> f.close()
>>> f = open('test', 'a+')
>>> f.tell()
0
>>> f.write('this is a test\n')
>>> f.tell()
30

そのため、データを書き込む前にファイルの最後までシークします。

これが本来あるべき姿です。fopen()マニュアルページから:

   a+     Open for reading and appending (writing at end  of  file).   The
          file is created if it does not exist.  The initial file position
          for reading is at the beginning  of  the  file,  but  output  is
          always appended to the end of the file.

ふぅ、幸運にも私は正しかった。

于 2012-06-13T14:58:55.957 に答える
3

バグではないと思います(これが何なのか正確にはわかりませんが)。ドキュメントは言う:

...'a' は追加用 (一部の Unix システムでは、現在のシーク位置に関係なく、すべての書き込みがファイルの末尾に追加されることを意味します)

これは実際に起こることです:

In [3]: hello = open('/tmp/hello', 'w')

In [4]: hello.write('Hello ')

In [5]: hello.close()

In [6]: world = open('/tmp/hello', 'a+')

In [7]: world.write('world!')

In [8]: world.close()

In [9]: open('/tmp/hello').read()
Out[9]: 'Hello world!'

私はUbuntuを使用しており、モードにtell()も戻ります。0a+

于 2012-06-13T14:27:13.377 に答える
1

に渡されたモードはopen()、Cfopen()関数に渡されるだけです。a+ファイルは読み取りと追加の両方のために開かれるため、ストリームの位置を 0 に設定することになっています。ほとんどの UNIX システム (およびおそらく他のシステム) では、ファイル内のどこに行ったかに関係なく、すべての書き込みはファイルの最後で行われますseek()

于 2012-06-13T14:57:26.593 に答える