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

时间:2018-09-12 08:52:40

标签: python python-3.x python-2.7 file-pointer

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

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

我的用例是我正在观察文件的更改并正在做一些事情,但是回滚将这个文件滚动到旧日期并创建一个新文件。但是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'

1 个答案:

答案 0 :(得分:16)

os.fstat在Windows和UNIX上可用,并比较inode编号(文件序列号)和设备ID uniquely identify a file within the system

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)来区分文件所在的驱动器/磁盘/设备的原因。