Python中检查两个文件指针是否指向同一个文件

13

我该如何检查两个文件指针是否指向同一个文件。

>>> fp1 = open("/data/logs/perf.log", "r")
>>> fp1
<open file '/data/logs/perf.log', mode 'r' at 0x7f5adc07cc00>
>>> fp2 = open("/data/logs/perf.log", "r")
>>> fp2
<open file '/data/logs/perf.log', mode 'r' at 0x7f5adc07cd20>
>>> fp1 == fp2
False
>>> fp1 is fp2
False

我的使用案例是我正在观察一个文件的变化并进行一些操作,但logback会将该文件滚动到旧日期并创建一个新文件。但是Python中的文件指针变量仍然指向旧文件。如果fp1!= fp2,我想将fp1更新为新文件。

为什么.name不起作用?当我尝试时,

mv /data/logs/perf.log /data/logs/perfNew.log
echo abctest >> /data/logs/perfNew.log

即使那时候,名称仍然是旧的。

>>> fp1.readline()
'abctest\n'
>>> fp1.name
'/data/logs/perf.log'

相关链接:https://stackoverflow.com/questions/23156274/multiple-file-handles-for-the-same-file - Jean-François Fabre
@Jean-FrançoisFabre 这个问题似乎与我的相关,但是没有被接受的答案,并且不能解决我的用例。 - Optimus Prime
@OptimusPrime,有一个被接受的答案声称你不能使用比较来处理文件句柄。无论如何,那就是我的理解。 - Ma0
我本可以将其标记为重复,但我没有这样做。因此是“相关”的而不是重复的。下面的fstat答案有效(竟然比我快几分钟,该死:)) - Jean-François Fabre
@Jean-FrançoisFabre 抱歉,我误读了你的评论。 - Optimus Prime
1个回答

18

os.fstat在Windows和UNIX上都可用,并且比较inode号(文件序列号)和设备ID可以唯一地识别系统中的文件

import os
fp1 = open("/data/logs/perf.log", "r")
fp2 = open("/data/logs/perf.log", "r")
stat1 = os.fstat(fp1.fileno())
stat2 = os.fstat(fp2.fileno())

# This comparison tests if the files are the same
stat1.st_ino == stat2.st_ino and stat1.st_dev == stat2.st_dev

fp1.close()
fp2.close()

st_ino是唯一标识驱动器上文件的inode号码。但是,相同的inode号码可以存在于不同的驱动器上,这就是为什么要使用st_dev(设备ID)来区分文件所在的驱动器/磁盘/设备。


1
请关闭 fp1fp2 ;) - Eric Duminil
@EricDuminil 我只关闭一个,这样可以吗? - Optimus Prime
1
@OptimusPrime:不,你需要确保每个文件句柄都已关闭。 - Eric Duminil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接