我想使用用户提供的字符串作为导出的文件名,但必须确保该字符串在我的系统上作为文件名是允许的。在我这边,可以用例如替换任何禁止的字符。 '_'。
在这里我找到了一个文件名禁止使用的字符列表.
使用
str.replace()
功能应该很容易,我只是想知道是否已经有东西可以做到这一点,甚至可能考虑到我使用的操作系统。
pathvalidate 是一个 Python 库,用于清理/验证字符串,例如文件名/文件路径/等。
这个库提供了两个用于验证路径的实用程序:
import sys
from pathvalidate import ValidationError, validate_filename
try:
validate_filename("fi:l*e/p\"a?t>h|.t<xt")
except ValidationError as e:
print("{}\n".format(e), file=sys.stderr)
以及用于清理路径的实用程序:
from pathvalidate import sanitize_filename
fname = "fi:l*e/p\"a?t>h|.t<xt"
print("{} -> {}".format(fname, sanitize_filename(fname)))
根据您的用例,将文件名中允许的字符列入白名单可能比尝试构建黑名单更容易。
规范的方法是检查文件名中的每个字符是否包含在可移植 posix 文件名字符列表中。
https://www.ibm.com/docs/en/zos/2.1.0?topic=locales-posix-portable-file-name-character-set
Uppercase A to Z
Lowercase a to z
Numbers 0 to 9
Period (.)
Underscore (_)
Hyphen (-)
基于此你可以:
ok = ".-_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
for character in filename:
assert character in ok
更好的解决方案可能是您使用生成的文件名在本地存储文件,这些文件名保证唯一且文件系统安全(例如,任何 UUID 生成器都可以)。维护一个简单的数据库,该数据库在原始文件名和 UUID 之间进行映射以供以后使用。