在Python中,使用os.path.isfile(filename)检查文件是否存在时,是否区分大小写?

12

我需要检查给定的文件是否存在,并且要区分大小写。

file = "C:\Temp\test.txt"
if os.path.isfile(file):
    print "exist..."
else:
    print "not found..."

C:\Temp文件夹下存在TEST.TXT文件。但是脚本显示的是对于文件="C:\Temp\test.txt" 的"file exist"输出,实际上应该显示"not found"。

谢谢。


只是为了明确,您希望 file 匹配 c:\Temp\TEST.TXT,还是 不要 匹配它? - MattDMo
2
你想要的与操作系统相违背。在Python中,C:\Temp\test.txtC:\Temp\TEST.TXT完全相同的,因此通过isfile得到的结果是正确的。 - Bakuriu
(因为Windows文件系统不区分大小写) - Alex K.
os.listdir() 是区分大小写的,尽管... - MattDMo
@Bakuriu 为了澄清一下,在Python中,在Windows系统上,如果文件系统不区分大小写(或者是其他类似的系统),C:\Temp\test.txtC:\Temp\TEST.TXT是完全相同的。但在Linux/Unix系统上,文件系统区分大小写,这个特性并不适用于Python。换句话说,这是在不同平台上实现 os.* 库函数的差异,而不是Python的特性。 - twalberg
@twalberg 是的,但我并没有看到任何问题。你试图在Windows上强制执行不同操作系统的策略。这绝对不是一个好主意。Python有特意设计不同的os实现以便您不必更改适用于不同操作系统的代码。顺便说一句:如果你想在Windows上使用posix的路径模块,可以这样做:import posixpath 然后使用 posixpath.isfile 而不是 os.path.isfile (虽然我不确定这是否适用于此特定情况)。 - Bakuriu
2个回答

19
列出目录中的所有名称,这样您就可以进行区分大小写的匹配:
def isfile_casesensitive(path):
    if not os.path.isfile(path): return False   # exit early
    directory, filename = os.path.split(path)
    return filename in os.listdir(directory)

if isfile_casesensitive(file):
    print "exist..."
else:
    print "not found..."

示例:

>>> import os
>>> file = os.path.join(os.environ('TMP'), 'test.txt')
>>> open(file, 'w')  # touch
<open file 'C:\\...\\test.txt', mode 'w' at 0x00000000021951E0>
>>> os.path.isfile(path)
True
>>> os.path.isfile(path.upper())
True
>>> def isfile_casesensitive(path):
...    if not os.path.isfile(path): return False   # exit early
...    directory, filename = os.path.split(path)
...    return any(f == filename for f in os.listdir(directory))
...
>>> isfile_casesensitive(path)
True
>>> isfile_casesensitive(path.upper())
False

@J.F.Sebastian:确实;any()是第一版的遗留问题,当时我回答了相反的问题(即完全错误)。当然,为什么OP想要这个有点神秘。 - Martijn Pieters
1
@J.F.Sebastian:对于 NTFS 上的大小写匹配目录加上文件名大小写完全相同但发生更改的情况(例如 TEST.TXT 文件,test.txt 目录),针对三种可能的不区分大小写输入(文件的确切大小写匹配、目录的确切大小写匹配以及第三种是对两者进行不区分大小写匹配但不匹配大小写的情况),os.path.isfile() 会做什么? - Martijn Pieters
我的猜测是,这是一种未定义的行为。 - jfs
通过这个解决方案进行检查是可行的,而且一切都很好。然而,在Windows上创建两个具有相同字符序列的文件是不可能的!如果在创建“test.txt”之前存在“Test.txt”,则可以向“test.txt”添加后缀,反之亦然,以创建这两个文件 - 因为对于区分大小写的语言(如德语:“Abendessen”(名词)与“abendessen”(动词))导出字典条目是必要的。 - meistermuh
@meistermuh:我不确定你的目标是什么;这里没有人在谈论创建文件。是的,在不区分大小写的文件系统上,您无法创建具有相同字母但大小写不同的文件,例如TextTEXTtexttExT等,在大多数Windows文件系统上都是相同的文件名(NTFS在底层是不区分大小写的,但Windows操作系统在其上添加了一个区分大小写的层)。 - Martijn Pieters
显示剩余2条评论

-2

在Windows下,Python 2.7中的os.path.isfile不区分大小写。

>>> os.path.isfile('C:\Temp\test.txt')
True
>>> os.path.isfile('C:\Temp\Test.txt')
True
>>> os.path.isfile('C:\Temp\TEST.txt')
True

1
不,分散注意力的事情太多了,你是正确的。然而,这并不是一个答案;OP正在询问如何进行区分大小写的测试。 - Martijn Pieters

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