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_b
和foo_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=(':', '*', '/', '"', '?', '>', '|', '<')
。所以基本上给了我需要在字符串中用允许的“后备”替换的字符列表。一个想法如何在不解析错误消息的情况下得到这个?
查看文档。他们有很多例子。
from pathvalidate import sanitize_filename
就是答案。如此处所述:pathvalidate.readthedocs.io/en/latest/pages/examples/…
您愿意将其放入您的答案中以使其完整吗?还是要我在那里添加?
请注意,您仍然需要验证文件名长度。【参考方案2】:
更好的解决方案可能是让您使用生成的文件名在本地存储文件,这些文件名保证唯一且文件系统安全(例如,任何 UUID 生成器都可以)。维护一个简单的数据库,在原始文件名和 UUID 之间进行映射以供以后使用。
【讨论】:
以上是关于python中确保字符串适合作为文件名的优雅方式?的主要内容,如果未能解决你的问题,请参考以下文章