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

Posted

技术标签:

【中文标题】如何删除 Python 中的错误路径字符?【英文标题】:How to remove bad path characters in 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?我们需要保留它,不是吗? 【参考方案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 有 GetInvalidFileNameChars 和 GetInvalidPathChars,但我不知道如何从 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中的非法文件字符。

以上是关于如何删除 Python 中的错误路径字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 2D 矢量网格中的部分路径?

如何删除python列表列表中的''(空字符串)?

python如何删除字符串中指定位置的字符

python如何批量对文件夹里所有excel特定行进行删除?

如何使用带有编解码器值的 python .replace 来删除特殊字符?

python如何删除字符串中指定位置字符?