目录上的os.listdir,在所有保留大小写的文件系统(包括 Windows 上的文件系统)中,返回您列出的目录中文件名的实际大小写。
因此,您需要在路径的每个级别进行此检查:
def onelevelok(parent, thislevel):
for fn in os.listdir(parent):
if fn.lower() == thislevel.lower():
return fn == thislevel
raise ValueError('No %r in dir %r!' % (
thislevel, parent))
我假设完全没有名称的任何大小写变化是另一种错误,并为此使用异常;并且,对于整个路径(假设没有驱动器号或无论如何都不会转换为 Windows 的 UNC):
def allpathok(path):
levels = os.path.split(path)
if os.path.isabs(path):
top = ['/']
else:
top = ['.']
return all(onelevelok(p, t)
for p, t in zip(top+levels, levels))
例如,如果foo/bar
不意味着它foo
在当前目录中,而是在其他地方,则您可能需要对此进行调整;或者,当然,如果实际上需要 UNC 或驱动器号(但正如我所提到的,将它们翻译成 Linux 无论如何都不是微不足道的;-)。
实施说明:我正在利用这样一个事实,即zip
只需将“额外条目”放在它正在压缩的最短序列的长度之外;所以我不需要从levels
第一个参数中明确切掉“叶子”(最后一个条目),zip
为我做。all
将尽可能短路,False
一旦检测到错误值就会返回,因此它与显式循环一样好,但更快更简洁。