Python不区分大小写的文件名?

9 python string file case-insensitive

我需要加载一个给定它名称的文件,但我得到的名称不区分大小写."A.txt"实际上可能是"a.txt".如何以快速的方式做到这一点(不生成所有可能的名称,并尝试每个)?

Eli*_*sky 7

您可以列出文件所在的目录(os.listdir),并查看您的文件名是否匹配.匹配可以通过下限文件名和比较来完成.

  • @ user975135:在你尝试这种方法之前我不会担心效率低下,而且你的需求太慢了. (4认同)

Chr*_*gan 5

如果没有目录列表并将您要查找的项目和目录中的每个项目都带到一个常见的案例进行比较,则无法执行此操作.文件系统区分大小写,这就是它的全部内容.

这是一个函数(好吧,两个),我写完了它,以不敏感的方式匹配文件名,递归地:http://portableapps.hg.sourceforge.net/hgweb/portableapps/development-toolkit/file/775197d56e86 /utils.py#l78.

def path_insensitive(path):
    """
    Get a case-insensitive path for use on a case sensitive system.

    >>> path_insensitive('/Home')
    '/home'
    >>> path_insensitive('/Home/chris')
    '/home/chris'
    >>> path_insensitive('/HoME/CHris/')
    '/home/chris/'
    >>> path_insensitive('/home/CHRIS')
    '/home/chris'
    >>> path_insensitive('/Home/CHRIS/.gtk-bookmarks')
    '/home/chris/.gtk-bookmarks'
    >>> path_insensitive('/home/chris/.GTK-bookmarks')
    '/home/chris/.gtk-bookmarks'
    >>> path_insensitive('/HOME/Chris/.GTK-bookmarks')
    '/home/chris/.gtk-bookmarks'
    >>> path_insensitive("/HOME/Chris/I HOPE this doesn't exist")
    "/HOME/Chris/I HOPE this doesn't exist"
    """

    return _path_insensitive(path) or path


def _path_insensitive(path):
    """
    Recursive part of path_insensitive to do the work.
    """

    if path == '' or os.path.exists(path):
        return path

    base = os.path.basename(path)  # may be a directory or a file
    dirname = os.path.dirname(path)

    suffix = ''
    if not base:  # dir ends with a slash?
        if len(dirname) < len(path):
            suffix = path[:len(path) - len(dirname)]

        base = os.path.basename(dirname)
        dirname = os.path.dirname(dirname)

    if not os.path.exists(dirname):
        dirname = _path_insensitive(dirname)
        if not dirname:
            return

    # at this point, the directory exists but not the file

    try:  # we are expecting dirname to be a directory, but it could be a file
        files = os.listdir(dirname)
    except OSError:
        return

    baselow = base.lower()
    try:
        basefinal = next(fl for fl in files if fl.lower() == baselow)
    except StopIteration:
        return

    if basefinal:
        return os.path.join(dirname, basefinal) + suffix
    else:
        return
Run Code Online (Sandbox Code Playgroud)