是否可以使用Python确保文件名或路径是Windows合法的?

是否可以使用Python确保文件名或路径是Windows合法的?,python,python-3.x,pathlib,Python,Python 3.x,Pathlib,我最近压缩了一些由我编写的脚本创建的文件,并使用同事将它们发送到Windows。他无法解压缩档案,因为我的一些文件名包含一个在Windows上不合法的: 去掉:很简单,但是如果在Windows路径/文件名中有其他我不知道的非法字符呢 我想知道pathlib的“纯”路径对象是否会以任何方式标记非法字符,但据我所知,它们并没有: >>> from pathlib import PurePosixPath, PureWindowsPath >>> pp = Pure

我最近压缩了一些由我编写的脚本创建的文件,并使用同事将它们发送到Windows。他无法解压缩档案,因为我的一些文件名包含一个在Windows上不合法的

去掉
很简单,但是如果在Windows路径/文件名中有其他我不知道的非法字符呢

我想知道
pathlib
的“纯”路径对象是否会以任何方式标记非法字符,但据我所知,它们并没有:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> pp = PurePosixPath("foo/bar:baz.txt")
>>> wp = PureWindowsPath(pp)
>>> print(wp)
foo\bar:baz.txt

鉴于我无法轻松访问Windows计算机进行测试,有没有简单的方法确保Python生成的路径/文件名是“Windows安全的”

最简单的解决方案就是在构建文件名时避免使用保留的Windows字符

查看以下链接:它引用以下为Windows非法字符:

使用当前代码页中的任何字符作为名称,包括Unicode字符和扩展字符集(128–255)中的字符,但以下字符除外:

以下保留字符:

  • <(少于)
  • >(大于)
  • :(冒号)
  • “(双引号)
  • /(正斜杠)
  • \(反斜杠)
  • |(垂直杆或管道)
  • ?(问号)
  • *(星号)

正如Maximilian Peters的链接所解释的,这是一个棘手的问题。如果上面的答案回答了您的问题,那么我们可以将此答案作为一个副本关闭。顺便说一句,在类似Unix的系统上,很容易创建一个“假答案”“文件系统位于常规文件中。因此,您可以创建一个小的NTFS或FAT32文件系统,用于测试文件名。@pm2上面的答案似乎假设您可以访问Windows系统。另外,它是在
pathlib
成为标准库的一部分之前编写的……我希望
pathlib
可以提供一个解决方案。也就是说,它可能提供了一个答案,即:它不可能做到。(您关于使用虚拟文件系统的建议很有用!)它们对于文件名是非法的,但对于路径则不是
c:\temp\tmp.txt
是一个有效的路径,但不是一个有效的文件名。IIRC,MS文件系统也不喜欢文件名中的
\n
。同意,其中一些字符保留用于文件路径,但不是文件名。我认为这仍然是可用的。只需将文件名按
“\\”
拆分,然后忽略项目
[0]
,对于列表的其余部分,请检查是否不包含上述字符。您也可以添加
\n
,但我发现这有点毫无意义。。。