在区分大小写的文件系统上检查文件时,您能否强制 os.path.isfile() 使用不区分大小写?

Dwi*_*yle 5 python beautifulsoup dita python-3.x

如果我os.path.isfile("foo.txt")用来检查名为 的文件Foo.txt,该函数将True在不区分大小写的文件系统和 Windows 上返回。但是,它在区分大小写的文件系统上返回 False。有没有办法强制对大小写isfile()敏感的文件系统进行不区分大小写的检查?我知道有一种方法可以在 Windows 上强制此函数区分大小写,但反过来呢?

背景

我正在处理 DITA 内容。如果您在 Windows 上开发 DITA 内容并将您的内容部署到区分大小写的 Linux 服务器,如果您的 href 属性包含与实际目标文件大小写不同的字符,则最终可能会导致主题之间的链接断开。我正在尝试制作一个脚本,它遍历我们 DITA 源中不是外部链接的每个 href 属性,并更新它以匹配实际文件的大小写。我可以使用 beautifulsoup 模块获取 href 属性,但是我很难弄清楚如何检查和验证实际文件名,以便我可以使用该字符串来更新我的 DITA 源中的 href 属性。

一种更严厉的方法是将每个 href 及其目标文件转换为小写,但如果外部站点有指向您的内容的链接并且它们已经具有正确的大小写,这可能会导致不同的问题。

isfile() 函数可能不是这项工作的正确工具,但它只是一个开始。我想我总是可以在 Windows 上运行这个脚本,但这不是很优雅。最好让脚本在大多数系统上正常运行。

enr*_*cis 5

您可以列出父目录中的所有文件并检查文件名(不区分大小写):

import os

def getfile_insensitive(path):
    directory, filename = os.path.split(path)
    directory, filename = (directory or '.'), filename.lower()
    for f in os.listdir(directory):
        newpath = os.path.join(directory, f)
        if os.path.isfile(newpath) and f.lower() == filename:
            return newpath

def isfile_insensitive(path):
    return getfile_insensitive(path) is not None
Run Code Online (Sandbox Code Playgroud)

该函数isfile_insensitive返回一个布尔值,指定父目录中是否存在与您要查找的文件名匹配的文件名(不区分大小写)。

该函数getfile_insensitive返回现有文件名的路径(大小写正确),以便您可以在系统中安全地使用该文件名。