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

Posted

技术标签:

【中文标题】python中确保字符串适合作为文件名的优雅方式?【英文标题】:Elegant way in python to make sure a string is suitable as a filename? 【发布时间】:2020-04-27 12:52:04 【问题描述】:

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

在这里我找到了list of forbidden characters for filenames。

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

【问题讨论】:

这是高度依赖平台的!所以try/except通常是最好的办法。 你应该可以使用os库的内置is_path_exists_or_creatable()函数。 我不仅想知道这个文件名是否允许,如果不允许,我想修复它。见有问题的第二句。实际上才意识到我说最初用'_'替换整个字符串,但我的意思只是替换字符串中不允许的字符。 假设用户提交了两个无效名称foo/a_bfoo_a/b。两者都将映射到foo_a_b:现在你应该做什么?如果用户(显然)要求您这样做,用第二个覆盖第一个是一回事;当用户认为他们提供了两个不同的名称时,另一件事完全是这样做的。 这个问题似乎本质上是***.com/questions/295135/…的副本 【参考方案1】:

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

【讨论】:

如果字符串是可接受的,很好。如果它导致错误,我将如何相应地更正文件名?错误消息确实指向解决方案。 invalid char found: invalids=(':', '*', '/', '"', '?', '&gt;', '|', '&lt;')。所以基本上给了我需要在字符串中用允许的“后备”替换的字符列表。一个想法如何在不解析错误消息的情况下得到这个? 查看文档。他们有很多例子。 from pathvalidate import sanitize_filename 就是答案。如此处所述:pathvalidate.readthedocs.io/en/latest/pages/examples/… 您愿意将其放入您的答案中以使其完整吗?还是要我在那里添加? 请注意,您仍然需要验证文件名长度。【参考方案2】:

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

【讨论】:

以上是关于python中确保字符串适合作为文件名的优雅方式?的主要内容,如果未能解决你的问题,请参考以下文章

大家知道这个少儿编程python真的适合孩子来学习吗?学习方式是啥样的啊?

python-介绍,数据类型

python检查字符串是不是为空-这是优雅的方式吗?

在 Hibernate 中实现基于条件的搜索页面的优雅方式

用Atom优雅地写Python

有没有一种简单、优雅的方式来定义单例? [复制]