38

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

解决方案

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

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

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

4 回答 4

35

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

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'
于 2012-11-27T22:01:10.387 回答
23

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

  • 窗户

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

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

于 2009-06-23T16:21:28.343 回答
-1

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

于 2009-06-23T15:48:32.703 回答
-1

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

于 2009-06-23T16:08:22.363 回答