5

如果我使用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 上运行这个脚本,但这不是很优雅。最好让脚本在大多数系统上正常运行。

4

2 回答 2

4

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

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

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

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

于 2014-09-15T08:17:22.093 回答
-4

如果您想要在 Windows(不敏感的操作系统)中获得相同的结果,这很简单,

bool_test = os.path.isfile(path.lower()) or os.path.isfile(path.upper())
于 2020-05-19T17:39:11.863 回答