python 中确保字符串适合作为文件名的优雅方式?

问题描述 投票:0回答:3

我想使用用户提供的字符串作为导出的文件名,但必须确保该字符串在我的系统上作为文件名是允许的。在我这边,可以用例如替换任何禁止的字符。 '_'。

在这里我找到了一个文件名禁止使用的字符列表.

使用

str.replace()
功能应该很容易,我只是想知道是否已经有东西可以做到这一点,甚至可能考虑到我使用的操作系统。

python filenames
3个回答
7
投票

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)))

1
投票

根据您的用例,将文件名中允许的字符列入白名单可能比尝试构建黑名单更容易。

规范的方法是检查文件名中的每个字符是否包含在可移植 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

        

0
投票

更好的解决方案可能是您使用生成的文件名在本地存储文件,这些文件名保证唯一且文件系统安全(例如,任何 UUID 生成器都可以)。维护一个简单的数据库,该数据库在原始文件名和 UUID 之间进行映射以供以后使用。

© www.soinside.com 2019 - 2024. All rights reserved.