Python中的区分大小写路径比较

8 投票
7 回答
16296 浏览
提问于 2025-04-16 21:37

我需要检查在Mac OS X的某个路径下是否有一个文件。

在这个目录里有一个叫做foo.F90的文件。

但是当我执行if(os.path.exists(PATH_TO_foo.f90))时,它返回的是“真”,也就是说它没有注意到f90是小写的,而实际上存在的文件是大写的F90。

我还试过open(PATH_TO_foo.f90, "r"),结果也不行。

我该怎么解决这个问题呢?

7 个回答

1

对于还在为这个问题苦恼的朋友们,下面这段代码对我有效。

from pathlib import Path

def path_exists_case_sensitive(p: Path) -> bool:
    """Check if path exists, enforce case sensitivity.

    Arguments:
      p: Path to check
    Returns:
      Boolean indicating if the path exists or not
    """
    # If it doesn't exist initially, return False
    if not p.exists():
        return False

    # Else loop over the path, checking each consecutive folder for
    # case sensitivity
    while True:
        # At root, p == p.parent --> break loop and return True
        if p == p.parent:
            return True
        # If string representation of path is not in parent directory, return False
        if str(p) not in map(str, p.parent.iterdir()):
            return False
        p = p.parent
1

这跟你的操作系统有关,而不是跟Python有关。比如,在Windows系统中,文件名不区分大小写,也就是说“file.txt”和“FILE.TXT”被认为是同一个文件。而在Linux系统中,文件名是区分大小写的,所以如果我在Linux上运行你提到的检查,大小写不敏感的匹配就不会返回“真”了。

>>> os.path.exists('F90')
True
>>> os.path.exists('f90')
False                      # on my linux based OS

不过,如果你真的想找到解决办法,可以这样做:

if 'f90' in os.listdir(os.path.dirname('PATH_TO_foo.f90')):
    # do whatever you want to do
13

正如一些评论者提到的,Python在不区分大小写的文件系统中,对路径的大小写并不太在意,所以那些用来比较或处理路径的函数可能无法满足你的需求。

不过,你可以通过os.listdir()间接测试一下,这个函数会返回目录中实际的文件名,包括它们的大小写。基于这个,你可以用下面的方式来检查文件是否存在:

'foo.f90' in os.listdir('PATH_TO_DIRECTORY')

撰写回答