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

如何删除Python中的错误路径字符?,python,path,illegal-characters,Python,Path,Illegal Characters,在Python中删除错误路径字符(例如“\”或“:”在Windows上)最跨平台的方法是什么 解决方案 因为似乎没有理想的解决方案,我决定相对限制,并使用了以下代码: def remove(value, deletechars): for c in deletechars: value = value.replace(c,'') return value; print remove(filename, '\/:*?"<>|') def删除(值,删除

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

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

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

print remove(filename, '\/:*?"<>|')
def删除(值,删除字符):
对于deletechars中的c:
值=值。替换(c“”)
返回值;
打印删除(文件名“\/:*?“|”)

该字符位于
os.sep
中,它将是“\”或“:”,这取决于您所在的系统。

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

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

  • :

    • 在当前代码页中几乎可以使用任何字符作为名称,包括Unicode字符和扩展字符集(128–255)中的字符,但以下字符除外:
      • 不允许使用以下保留字符:
        < > : " / \ | ? *
      • 不允许使用整数表示形式在0到31之间的字符
      • 目标文件系统不允许的任何其他字符
    可接受字符的列表可能会有所不同,具体取决于首先格式化文件系统的计算机的操作系统和语言环境

    NET有和,但我不知道如何从Python调用它们

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

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

我认为最安全的方法是替换任何可疑字符。所以,我认为你可以替换(或去掉)任何不是字母数字的东西,,,,空格或句点。下面是您如何做到这一点的:

import re
re.sub('[^\w\-_\. ]', '_', filename)
上述转义不是字母、
'
'-'
'.
或带有
'
的空格的所有字符。因此,如果您查看的是整个路径,那么您还需要将os.sep放入已批准的字符列表中

以下是一些示例输出:

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

这还不包括:“%/^ |?”在Windows中也是非法的文件字符。
os.path
的哪一部分有助于确定合法的文件名?
。支持\u unicode\u文件名
可能有一点,但这还不够。如果路径长,可能会快一点:“.join(如果我不在r'\/:*?“\124;”),@fortran,这应该是一个答案,而不是一个评论——在我个人看来,这是非常“pythonic”的。谢谢。但是关于指定驱动器的
字符,例如
C:\Downloads
?我们需要保留这一点,不是吗?+1,有用的答案。这些反斜杠需要转义吗?最好使用r'raw字符串。是的。。。我想如果你不使用
r'…'
,你仍然需要在每个反斜杠前面加一个反斜杠。因此总共有10个反斜杠。看起来我对上一次编辑很着迷。这是完全正确的。请记住,它只允许特定字符(不排除一组字符)。原始字符串是不必要的。请参阅我的说明和更新答案中的示例输出。如果要将多个转义字符组合成单个
请在正则表达式搜索字符串中添加
+
'[^\w\-\u\.]+'
注意,在Windows上,如果尝试使用
CON.*
等文件名,也会出现问题。文件名末尾的空格也会导致问题。@是的,传统的DOS设备名在Win32中作为文件名。但文件系统对它们的支持很好,使用NT API绕过Win32也很好。(至少,据我记忆所及,我已经没有Windows机器可供测试了。)您可以使用NT API进行测试,但Python不行。不幸的是,windows上的Python在文件名处理方面受到限制。最糟糕的是,错误的文件名经常会以静默方式失败,或者给您一个不同于您要求的文件(尝试在控制台运行的脚本中打开
CON
)。