Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打开已打开的文件不会引发异常_Python_File_Exception_Io - Fatal编程技术网

Python 打开已打开的文件不会引发异常

Python 打开已打开的文件不会引发异常,python,file,exception,io,Python,File,Exception,Io,考虑这两个python程序: 脚本a.py: from datetime import datetime from time import sleep while True: sleep(1) with open('foo.txt', 'w') as f: sleep(3) s = str(datetime.now()) f.write(s) sleep(3) while True: with open(

考虑这两个python程序:

脚本a.py

from datetime import datetime
from time import sleep

while True:
    sleep(1)
    with open('foo.txt', 'w') as f:
        sleep(3)
        s = str(datetime.now())
        f.write(s)
        sleep(3)
while True:
    with open('foo.txt') as f:
        s = f.read()
        print s
script_b.py

from datetime import datetime
from time import sleep

while True:
    sleep(1)
    with open('foo.txt', 'w') as f:
        sleep(3)
        s = str(datetime.now())
        f.write(s)
        sleep(3)
while True:
    with open('foo.txt') as f:
        s = f.read()
        print s
运行
脚本a.py
。当它运行时,启动
script_b.py
。两者都将愉快地运行,但是如果文件当前由
script_b.py
打开,则
script_b.py
会输出一个空字符串


我希望引发一个
IOError
异常,告诉我文件已经打开,但没有发生,而是文件看起来是空的。为什么会这样?检查它是否被另一个进程打开的正确方法是什么?只需检查是否返回了空字符串并重试,直到读取其他内容,或者是否有更符合Python的方式?

只要操作系统不阻止您,您可以随意打开文件多次。对于将多个游标放入一个文件以进行复杂操作,这有时很有用

script_b.py
认为文件为空的原因是文件为空:

with open('foo.txt', 'w') as f:
w
模式下打开文件会立即删除(即截断)文件。在
script\u a
中,文件完全为100%空,这就是
script\u b
看到的最初三秒钟的间隔

在调用
f.write
后的三秒钟间隔内,文件仍然。。。可能是空的。这是由于缓冲-磁盘上的文件不能保证包含您用
写入
写入的所有内容,除非您关闭
(即退出上下文管理器块)或手动调用文件句柄上的
刷新

或者,您可以在无缓冲模式下打开,以便写入操作总是立即写入磁盘

with open('foo.txt','w',0) as f:
   #no buffering, f.write() writes immediately to disk

请参阅关于多文件打开在Python中如何工作的其他答案和注释。如果您已经阅读了所有这些内容,并且仍然希望在POSIX平台上锁定对该文件的访问,那么您可以使用该库

请记住:A)其他程序可能会忽略您对文件的锁定,B)某些网络文件系统无法很好地实现锁定,或者根本无法实现锁定C)请务必非常小心地释放锁定并避免死锁,因为flock不会检测到它

例如。。。。 脚本a.py

from datetime import datetime
from time import sleep
import fcntl

while True:
    sleep(1)
    with open('foo.txt', 'w') as f:
        s = str(datetime.now())

        print datetime.now(), "Waiting for lock"
        fcntl.flock(f, fcntl.LOCK_EX)
        print datetime.now(), "Lock clear, writing"

        sleep(3)
        f.write(s)

        print datetime.now(), "releasing lock"
        fcntl.flock(f, fcntl.LOCK_UN)
脚本_b.py

import fcntl
from datetime import datetime

while True:
    with open('foo.txt') as f:
        print datetime.now(), "Getting lock"
        fcntl.flock(f, fcntl.LOCK_EX)
        print datetime.now(), "Got lock, reading file"

        s = f.read()

        print datetime.now(), "Read file, releasing lock"
        fcntl.flock(f, fcntl.LOCK_UN)

        print s

希望这有帮助

只有Windows在打开进行写入时才锁定文件。POSIX平台没有;这不是Python的问题。相反,它是你的操作系统的一项功能。你将不得不使用锁;显式锁定某个进程写入的文件。哦,我不知道这与操作系统有关,谢谢!如果是这样,我想知道这个问题是否仍然属于stackoverflow…两个脚本都打开文件进行读取,每个
open()
都会截断文件。然后还有缓冲;在刷新缓冲区之前,文件的其他读取器不会立即看到写入操作。由于处于
r
模式,因此
script\u b
打开不会截断。你是对的,我没有在
script\u a
的第二个3秒窗口中解决缓冲问题。