检查文件系统是否在Python中不区分大小写

Lor*_*ein 15 python filesystems ntfs hfs+

如果文件系统不区分大小写,是否有一种简单的方法来检查Python?我正在考虑像HFS +(OSX)和NTFS(Windows)这样的文件系统,你可以在其中访问与foo,Foo或FOO相同的文件,即使保留了文件大小写.

Amb*_*ber 18

import os
import tempfile

# By default mkstemp() creates a file with
# a name that begins with 'tmp' (lowercase)
tmphandle, tmppath = tempfile.mkstemp()
if os.path.exists(tmppath.upper()):
    # Case insensitive.
else:
    # Case sensitive.
Run Code Online (Sandbox Code Playgroud)

  • 如果临时文件不在感兴趣的文件系统中,会发生什么? (3认同)

Ste*_*hen 6

除非明确处理关闭和删除,否则Amber提供的答案将留下临时文件碎片.为避免这种情况,我使用:

import os
import tempfile

def is_fs_case_sensitive():
    #
    # Force case with the prefix
    #
    with tempfile.NamedTemporaryFile(prefix='TmP') as tmp_file:
        return(not os.path.exists(tmp_file.name.lower()))
Run Code Online (Sandbox Code Playgroud)

虽然我的使用案例通常不止一次地测试这个,所以我存储结果以避免不止一次触摸文件系统.

def is_fs_case_sensitive():
    if not hasattr(is_fs_case_sensitive, 'case_sensitive'):
        with tempfile.NamedTemporaryFile(prefix='TmP') as tmp_file:
            setattr(is_fs_case_sensitive,
                    'case_sensitive',
                    not os.path.exists(tmp_file.name.lower()))
    return(is_fs_case_sensitive.case_sensitive)
Run Code Online (Sandbox Code Playgroud)

如果仅调用一次,则速度稍慢,而在其他情况下调整速度要快得多.

  • 迄今为止最好的解决方案,但该函数应该将源目录作为输入参数,因为至少在 OSX 上,它可能会因*每个路径*而异。不开玩笑。 (2认同)