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

Python 在区分大小写的文件系统上检查文件时,是否可以强制os.path.isfile()使用不区分大小写?,python,python-3.x,beautifulsoup,dita,Python,Python 3.x,Beautifulsoup,Dita,如果我使用os.path.isfile(“foo.txt”)检查名为foo.txt的文件,则函数在不区分大小写的文件系统和窗口上返回True。但是,对于区分大小写的文件系统,它返回False。有没有办法强制对isfile()进行不区分大小写的检查,即使是在区分大小写的文件系统上?我知道有一种方法可以在Windows上强制此函数区分大小写,但另一种方法呢 背景 我正在处理DITA内容。如果在Windows上开发DITA内容并将内容部署到区分大小写的Linux服务器上,如果href属性的字符大小写与

如果我使用
os.path.isfile(“foo.txt”)
检查名为
foo.txt
的文件,则函数在不区分大小写的文件系统和窗口上返回
True
。但是,对于区分大小写的文件系统,它返回False。有没有办法强制对
isfile()
进行不区分大小写的检查,即使是在区分大小写的文件系统上?我知道有一种方法可以在Windows上强制此函数区分大小写,但另一种方法呢

背景

我正在处理DITA内容。如果在Windows上开发DITA内容并将内容部署到区分大小写的Linux服务器上,如果href属性的字符大小写与实际目标文件不同,则主题之间的链接可能会断开。我试图创建一个脚本,该脚本遍历DITA源中的每个href属性,而不是外部链接,并对其进行更新以匹配实际文件的大小写。我可以通过beautifulsoup模块获得href属性,但我很难弄清楚如何检查和验证实际文件名,以便使用该字符串更新DITA源中的href属性

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


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

您可以列出父目录中的所有文件,并无意识地检查文件名大小写:

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\u insensitive
返回一个布尔值,指定父目录中是否有与您不区分大小写查找的文件名匹配的文件名


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

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

bool_test = os.path.isfile(path.lower()) or os.path.isfile(path.upper())

请注意,
目录
可能为空,这将导致错误。您最好检查
f
是否为文件类型:)@WKPlus Nice catch,现在检查;)这很有效。遗憾的是,还没有为os.path.isfile()创建一个函数来处理这个问题。谢谢你的回答!在进一步编写脚本之后,我想知道是否真的需要os.path.isfile(newpath)
f
是一个具有文件名的变量,该文件名是通过
os.listdir
找到的,因此我们无需再次检查该文件是否存在。对吗?if语句的最后一部分,
f.lower()==filename
当然仍然是必需的。这是错误的,因为如果文件名为“aBc”,则不会检测到它