23

プログラムでファイルを複数回開くと、シークポインタが共有される可能性がある低レベル言語のケースを思い出しているようです。Pythonを少しいじってみると、これは私には起こっていないようです。

$ cat file.txt
first line!
second
third
fourth
and fifth
>>> f1 = open('file.txt')
>>> f2 = open('file.txt')
>>> f1.readline()
'first line!\n'
>>> f2.read()
'first line!\nsecond\nthird\nfourth\nand fifth\n'
>>> f1.readline()
'second\n'
>>> f2.read()
''
>>> f2.seek(0)
>>> f1.readline()
'third\n'

この動作は安全であることがわかっていますか?私はそれが大丈夫だと言っている情報源を見つけるのに苦労しています、そして私がこれに頼ることができればそれは大いに役立つでしょう。

位置をファイルオブジェクトの属性として表示していません。そうでない場合は、これに自信があります。私はそれがイテレータの内部に保持される可能性があることを知っていますが、その場合に.tell()がどのようにそれに到達するかをidkします。

>>> dir(f1)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__',
 '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__str__', 'close', 'closed', 'encoding', 'fileno', 'flush',
 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline',
 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines',
 'xreadlines']

更新Pythonエッセンシャルリファレンスの
161ページに記載されています

同じファイルを同じプログラム(または異なるプログラム)で複数回開くことができます。開いているファイルの各インスタンスには、個別に操作できる独自のファイルポインタがあります。

したがって、実際には安全で定義された動作のようです

4

1 に答える 1

15

最新の OS (UNIX ライクな OS の場合は 1969 年以降、Windows の場合は 2000 年以降、おそらくそれ以前ですが、最初の「最新の」Windows として Win2K をカウントしています) では、開いているファイル (ファイル記述子) の各インスタンス独自のシーク ポインターがあります。Python のfileクラスには、インスタンスに状態を共有させる魔法はありません。file通常の C ファイル ハンドルのラッパーであり、それ自体が OS ファイル記述子をカプセル化し、対応する C関数の実装file.tell()file.seek()呼び出しを行います。stdio(厄介な詳細については、CPython の を参照してくださいfileobject.c。) C ライブラリの動作と基礎となる OS の動作には違いがある可能性がありますが、この特定のケースでは、それは要因ではありません。

IronPython または Jython を使用している場合、その基になる実装には標準の .Net または Java ファイル オブジェクトが使用され、標準の C ライブラリまたは OS 実装が使用されます。

したがって、奇妙な I/O 動作を伴う非標準 OS で何らかの方法で Python を実行していない限り、あなたのアプローチは問題ありません。

タイムリーにフラッシュしないと、書き込み時に予期しない結果が生じる可能性があります。データが実際にディスクにヒットする前に、しばらくの間メモリ内にたむろし、同じファイルで開いた他のファイル記述子で使用できるようになります。abarnert がコメントで指摘しているように、非常に単純な場合を除いて、とにかく問題があります。

于 2013-01-24T21:01:23.727 に答える