如果他们指向同一个文件,我必须比较两条路径。在Unix中,这可以使用os.path.samefile
来完成,但正如文档所述,它在Windows中不可用。
模拟此功能的最佳方法是什么?
它不需要模拟常见情况。就我而言,有以下简化:
现在我使用以下内容:
def samefile(path1, path2)
return os.path.normcase(os.path.normpath(path1)) == \
os.path.normcase(os.path.normpath(path2))
这样可以吗?
答案 0 :(得分:5)
根据issue#5985,os.path.samefile和os.path.sameopenfile现在位于py3k中。我在Python 3.3.0上验证了这一点
对于旧版本的Python,这是一种使用GetFileInformationByHandle函数的方法:
答案 1 :(得分:3)
os.stat系统调用返回一个元组,其中包含有关每个文件的大量信息 - 包括创建和上次修改时间戳,大小,文件属性。具有相同参数的不同文件的机会非常小。我认为这是非常合理的:
def samefile(file1, file2):
return os.stat(file1) == os.stat(file2)
答案 2 :(得分:2)
os.path.samefile
的实际用例不是符号链接,而是硬链接。如果os.path.samefile(a, b)
和a
都是指向同一文件的硬链接,则b
会返回True。他们可能没有相同的路径。
答案 3 :(得分:0)
我知道这是该主题的较晚答案。但是我在Windows上使用python,今天遇到了这个问题,找到了这个线程,发现os.path.samefile
对我不起作用。
因此,要回答OP now to emulate os.path.samefile
,这就是我的模拟方法:
# because some versions of python do not have os.path.samefile
# particularly, Windows. :(
#
def os_path_samefile(pathA, pathB):
statA = os.stat(pathA) if os.path.isfile(pathA) else None
if not statA:
return False
statB = os.stat(pathB) if os.path.isfile(pathB) else None
if not statB:
return False
return (statA.st_dev == statB.st_dev) and (statA.st_ino == statB.st_ino)
这不是尽可能严格,因为我对清楚自己在做什么很感兴趣。
我在Windows-10上使用python 2.7.15对此进行了测试。