在Python中一次打开几次文件是否安全?

时间:2013-01-24 20:58:31

标签: python file seek

我似乎回想起低级语言中的情况,即在程序中多次打开文件可能会导致共享的搜索指针。通过乱用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'

这种行为是否安全?我很难找到一个消息来源说它没关系,如果我可以依赖它,它会有很大的帮助。

我没有将该位置视为文件对象的属性,否则我对此更有信心。我知道它可以保存在迭代器内部,但是在这种情况下,id。如何.tell()会得到它。

>>> 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']

更新
The Python Essential Reference的第161页上,它说明了

  

同一个程序中可以多次打开同一个文件(或者在同一个程序中)   不同的节目)。打开文件的每个实例都有自己的实例   可以独立操作的文件指针。

所以它似乎实际上是安全的,定义的行为

1 个答案:

答案 0 :(得分:8)

在现代操作系统上(1969年之后用于类UNIX操作系统,或2000年之后用于Windows,可能在此之前,但我将Win2K视为第一个“现代”Windows),每个打开文件的实例(文件描述符)有自己的搜索指针。 Python的file类中没有任何魔法会导致实例共享状态; file是普通C文件句柄的包装器,它本身封装了OS文件描述符,file.tell()file.seek()的实现调用了相应的C stdio函数。 (有关凌乱的细节,请参阅CPython的fileobject.c。)C库行为与底层操作系统行为之间可能存在差异,但在这种特殊情况下,这不是一个因素。

如果您正在使用IronPython或Jython,它将使用标准的.Net或Java文件对象进行底层实现,而后者将使用标准C库或操作系统实现。

所以你的方法没问题,除非你在一些非标准操作系统上以某种方式运行Python,并且有奇怪的I / O行为。

如果不及时冲洗,写作时可能会出现意外结果;数据可以在实际命中磁盘之前在内存中挂起一段时间,并且可用于您在同一文件上打开的其他文件描述符。正如abarnert在评论中指出的那样,无论如何这都是有问题的,除非是非常简单的情况。