在Python中检测文件删除后的损坏流
我的问题是,当一个Python程序的日志文件被轮换(也就是换成新的日志文件)时,日志记录就停止了。我发现问题出在流(stream)本身。我没有找到任何方法可以判断这个流在Python中是否已经坏掉。即使文件被删除了,它仍然可以正常写入。
import os
FILE = 'testing.txt'
fs = open(FILE, 'a')
fs.write('word')
os.remove(FILE)
fs.write('Nothing....') # Nothing breaks
print(fs.errors) # No errors
那么,我该如何判断这个文件流是否仍然有效呢?检查文件是否存在也没有用,因为无论流是否有效,文件总是会存在。
4 个回答
0
如果你需要比简单的 try: except:
更聪明的功能,可以使用 Python 的 ionotify 绑定。不过我觉得这只适用于 Linux 系统(我不太确定你使用的是什么平台)。
0
试试这个异常处理的教程:
import os
FILE = 'testing.txt'
try:
fs = open(FILE, 'a')
fs.write('word')
os.remove(FILE)
fs.write('Nothing....') # Nothing breaks
except Exception, e:
print "Error:", e
print(fs.errors) # No errors
2
经过仔细检查,我找到了问题的解决办法。这是一个与操作系统有关的问题。在Linux(或Macintosh)中,当文件被删除时,它只是取消了链接。(我之前对此并不清楚)
[user@machine]$ lsof | grep --color -i "testing.txt"
python26 26495 user 8w REG 8,33 23474 671920 /home/user/temp/testing.txt (deleted)
解决办法是在Python中检查这个流。
stat = os.fstat(fs.fileno())
这样你就能知道它有多少个链接。
if stat.st_nlink < 1:
#has been deleted
这样一来,你就知道是否需要重新加载它了。希望这能帮助到其他人。