如何在Python中去除无效路径字符?

48 投票
6 回答
40753 浏览
提问于 2025-04-15 12:27

在Python中,怎样才能最方便地去掉不好的路径字符(比如在Windows上常见的“\”或“:”)呢?

解决方案

因为似乎没有完美的解决办法,我决定采取比较严格的方法,使用了以下代码:

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

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

6 个回答

2

你可以使用来自跨平台模块的sanitize_filepath()方法,它可以从路径中去除所有不好的(系统)字符:

from pathvalidate import sanitize_filepath
filename= sanitize_filepath(filename)
48

我觉得最安全的方法就是把任何可疑的字符替换掉。所以,你可以把那些不是字母、数字、减号(-)、下划线(_)、空格或者句点(.)的字符都替换掉或者去掉。下面是具体的做法:

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'
27

很遗憾,不同的操作系统和文件系统对可用字符的要求是不一样的。

  • Windows:

    • 在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及其他非本地文件系统:各自的要求不同

最好的办法可能是对所有平台都采取比较保守的做法,或者直接尝试创建文件名并处理可能出现的错误。

撰写回答