如何删除 Python 中的错误路径字符?

新手上路,请多包涵

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

解决方案

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

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

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

原文由 Martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

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

  • 使用当前代码页中的几乎任何字符作为名称,包括 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 和其他非本机文件系统:各不相同

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

原文由 ephemient 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

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

The above escapes every character that’s not a letter, '_' , '-' , '.' or space with an '_' .因此,如果您正在查看整个路径,您也会希望将 os.sep 放入已批准字符列表中。

这是一些示例输出:

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

原文由 Josh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题