Python中glob.glob在Windows上不区分文件名大小写的问题与解决方案

如题,本来希望使用大写后缀名和小写后缀名分别找出不同的文件,结果找出的结果都是一样的,发现原来 glob.glob 在非 POSIX 系统不区分大小写,略坑,也没有提示。。

至少应该给用户提示一下,或者来一个是否 ignore case 的选项。

完整记录在这里: https://jdhao.github.io/2019/06/24/python_glob_case_sensitivity/


Python中glob.glob在Windows上不区分文件名大小写的问题与解决方案

22 回复

windows 本来就不区分大小写。


在Windows上,glob.glob 不区分大小写是因为底层文件系统(NTFS)默认是大小写不敏感的。这会导致模式匹配时出现预期外的结果,比如 glob.glob('*.TXT') 会匹配到 file.txt

解决方案:

  1. 使用 os.scandiros.listdir 手动过滤

    import os
    import fnmatch
    
    def case_sensitive_glob(pattern, root_dir='.'):
        matches = []
        for entry in os.scandir(root_dir):
            if fnmatch.fnmatchcase(entry.name, pattern):
                matches.append(entry.path)
        return matches
    
    # 示例:只匹配大写 .TXT 文件
    files = case_sensitive_glob('*.TXT')
    print(files)  # 只匹配 'FILE.TXT',不会匹配 'file.txt'
    
  2. 使用 pathlib.Path.glob 并手动过滤(Python 3.4+):

    from pathlib import Path
    
    def case_sensitive_pathlib_glob(pattern, root_dir='.'):
        path = Path(root_dir)
        return [p for p in path.glob('*') if p.match(pattern)]
    
    # 示例
    files = case_sensitive_pathlib_glob('*.TXT')
    
  3. 使用正则表达式精确匹配

    import os
    import re
    
    def regex_glob(pattern, root_dir='.'):
        regex = re.compile(pattern)
        return [os.path.join(root_dir, f) for f in os.listdir(root_dir) if regex.fullmatch(f)]
    
    # 示例:匹配以大写 .TXT 结尾的文件
    files = regex_glob(r'.*\.TXT$')
    

总结: 在Windows上实现大小写敏感的glob匹配,需要手动过滤文件名。

系统不分,它自己怎么区分?

NTFS 有开关可以打开大小写区分,不过不知道 glob 适配了没

系统不分,不代表 glob 可以不分,至少可以提供一个选择

你去试着写一个试图区分大小写的 win32 应用,如果能实现再来说这个话

ntfs 区分,但是 windows 不区分,你总不能自己写裸盘吧

目前没这个需求。

你可以在 linux 下用 NTFS-3G 创建两个仅大小写不同的文件,再到 windows 下看看

我以前试过装黑果把系统分区格式化成大小写敏感的 apfs 之后有些程序会报错

#9 我目前用的就是区分大小写的 APFS,感觉还行就 Steam 用不了,其他我日常使用的软件都正常。

当时我 pycharm 的右下角一直弹泡泡报错…

Windows 的 NTFS 现在已经可以设置区分大小写了

#7 巧了,glob.glob 也没这个需求

哦,你是这个模块的开发者?

msvc 的 cl 已经可以处理大小写敏感了(为了支持 wsl 创建的文件夹),不过目前还是用 wsl 处理 NTFS 上大小写敏感的文件比较好。

#11
这个是 Pycharm 的问题,我用的 IDEA 也有一样的问题,但是可以修复。点开气泡它会提示你怎么操作

自己水就水,别怪他人

大神好,膜拜大神

这取决于你从哪个角度看这个问题了。
从 Python 跨平台的角度可能是有一些出乎意料。但是如果从 windows 平台应用的角度来看,你突然出现一个对大小写敏感的应用才是更加出乎意料的。
所以我觉得 python 的这个行为应该说是符合预期的才对。

是 CRT 支持了吧,cl 本身应该没这个问题的。

回到顶部