如何删除 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 中的错误路径字符?的主要内容,如果未能解决你的问题,请参考以下文章
python如何批量对文件夹里所有excel特定行进行删除?