我有一些在 Windows 环境中创建但部署在 Linux 上的 xml 配置文件。这些配置文件通过文件路径相互引用。我们之前遇到过区分大小写和尾随空格的问题,我想编写一个脚本来检查这些问题。如果有帮助,我们有 Cygwin。
例子:
假设我有一个对文件 foo/bar/baz.xml 的引用,我会这样做
<someTag fileref="foo/bar/baz.xml" />
现在如果我们错误地这样做:
<someTag fileref="fOo/baR/baz.Xml " />
它仍然可以在 Windows 上运行,但在 Linux 上会失败。
我想做的是检测这些文件中的文件引用在区分大小写方面与真实文件不匹配的情况。
最佳答案
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))
我假设完全没有名称的任何大小写变体是一种不同类型的错误,并为此使用异常;并且,对于整个路径(假设没有驱动器号或 UNC 无论如何都不会转换为 Windows):
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
一旦检测到假值,它就和显式循环一样好,但更快、更简洁。
关于python - 在 Windows 中检测文件名的大小写不匹配(最好使用 python)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1356386/