python - 在 Windows 中检测文件名的大小写不匹配(最好使用 python)?

标签 python windows case-sensitive

我有一些在 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/

相关文章:

windows - 使用 flex 播放来自 Windows 共享的视频

java - 命令行参数是否有任何命名约定?

c# - .NET 字符串操作区分大小写吗?

windows - 不区分大小写的文件系统上的区分大小写的文件困扰着存储库

python - Pandas 在列中读取带有额外逗号的 csv

python - 将字典键连接到字符串

python - 字典 : replacing key characters with whitespace

python - 如何将参数传递给 Scikit-Learn Keras 模型函数

c++ - 创建带有精美细边框的文本字段。 Winapi

windows - GIT将资源共享到多个存储库