【问题标题】:How to remove bad path characters in Python?如何删除 Python 中的错误路径字符?
【发布时间】:2010-11-05 05:27:50
【问题描述】:

在 Python 中删除错误路径字符(例如 Windows 上的“\”或“:”)的最跨平台方法是什么?

解决方案

因为似乎没有理想的解决方案,我决定相对限制并使用以下代码:

def remove(value, deletechars):
    for c in deletechars:
        value = value.replace(c,'')
    return value;

print remove(filename, '\/:*?"<>|')

【问题讨论】:

  • 可能会快一点,如果路径很长:"".join(i for i in value if i not in r'\/:*?"|')
  • @fortran,这应该是一个答案,而不是评论——在我个人看来,它非常“pythonic”。谢谢。
  • 但是: 字符指定驱动器呢,例如C:\Downloads?我们需要保留它,不是吗?

标签: python path illegal-characters


【解决方案1】:

我认为这里最安全的方法是替换任何可疑字符。因此,我认为您可以替换(或删除)任何不是字母数字、-、_、空格或句点的内容。以下是你的做法:

import re
re.sub(r'[^\w\-_\. ]', '_', filename)

上面转义了每个不是字母的字符,'_''-''.' 或带有'_' 的空格。因此,如果您正在查看整个路径,您也需要将 os.sep 放入已批准的字符列表中。

这是一些示例输出:

In [27]: re.sub(r'[^\w\-_\. ]', '_', r'some\*-file._n\\ame')
Out[27]: 'some__-file._n__ame'

【讨论】:

  • +1,有用的答案。这些反斜杠是否需要转义?
  • 最好使用 r'raw string'。
  • 是的......我想如果你不使用r'...',你仍然需要在每个反斜杠前面加上一个反斜杠。因此总共有 10 个反斜杠。
  • 看起来我对最后一次编辑感到很兴奋。它是正确的。请记住,它只允许特定字符(不排除一组字符)。原始字符串是不必要的。请参阅我的说明和更新答案中的示例输出。
  • 如果您想将多个转义字符组合成一个_,请在正则表达式搜索字符串中添加+'[^\w\-_\. ]+'
【解决方案2】:

不幸的是,可接受的字符集因操作系统而异因文件系统而异。

  • Windows:

    • 几乎可以使用当前代码页中的任何字符作为名称,包括 Unicode 字符和扩展字符集 (128–255) 中的字符,但以下字符除外:
      • 不允许使用以下保留字符:
        : " / \ | ? *
      • 不允许使用整数表示在 0 到 31 范围内的字符。
      • 目标文件系统不允许的任何其他字符。

    接受的字符列表可能会有所不同,具体取决于首先格式化文件系统的机器的操作系统和区域设置。

    .NET 有 GetInvalidFileNameCharsGetInvalidPathChars,但我不知道如何从 Python 中调用它们。

  • Mac OS:始终排除 NUL,POSIX 层排除“/”,Apple API 排除“:”
    • HFS+:由 Unicode 2.0 规范中的 UTF-16 表示的任何非排除字符序列
    • HFS:可以用 MacRoman(默认)或其他编码表示的任何非排除字符序列,具体取决于创建文件系统的机器
    • UFS:与 HFS+ 相同
  • Linux:
    • 本机(类 UNIX)文件系统:任何字节序列,不包括 NUL 和“/”
    • FAT、NTFS、其他非本地文件系统:变化

您最好的选择可能是在所有平台上都过于保守,或者只是尝试创建文件名并处理错误。

【讨论】:

  • 请注意,在 Windows 上,如果您尝试使用 CON.* 之类的文件名,也会遇到问题。文件名末尾的空格也会导致问题。
  • @Antimony 是的,旧的 DOS 设备名称 cannot be used 作为 Win32 中的文件名。但是文件系统很好地支持它们,并且使用 NT API 绕过 Win32 工作正常。 (至少,据我回忆;我没有 Windows 机器可以测试了。)
  • 您也许可以使用 NT API 来做到这一点,但 Python 不能。不幸的是,Windows 上的 Python 在文件名处理方面受到限制。最糟糕的是,错误的文件名通常会默默地失败,或者为您提供与您要求的文件不同的文件(尝试在从控制台运行的脚本中打开 CON)。
【解决方案3】:

如果您使用 python,请尝试os.path 以避免路径的跨平台问题。

【讨论】:

  • os.path 的哪一部分有助于确定合法的文件名? .supports_unicode_filenames 可能有点,但这还不够。
【解决方案4】:

该字符在os.sep 中,它将是“\”或“:”,具体取决于您使用的系统。

【讨论】:

  • 不包括:"%/^|?,这也是Windows中的非法文件字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多