将字符串可逆编码为unix文件名

时间:2014-02-13 18:03:24

标签: python linux python-3.x encoding filenames

有没有办法将任意用户输入名称转换为具有可逆编码的安全文件名?

我有一些属于用户命名的实体的数据文件。当然,他们可以做些愚蠢的事情,比如在名字中放入无效的文件系统字符。

我经常看到的两个建议是:

A)Base64对它们进行编码

B)剥离非法字符

Base64是可逆的,但是对于调试/内省,当文件名看起来和名字一样时,它真的很好。只是保持一切更可调试。方法B是不可逆的,因此无论如何都必须冗余地存储“实际”名称,因此不仅仅使用uuid或其他东西也没有实际价值。

这是专门针对Linux的。虽然这不是特定于python的,但我正在实现它。

2 个答案:

答案 0 :(得分:4)

您可以使用网址编码:

from urllib.parse import quote

safefilename = quote(filename, safe='')

这是完全可以绕过的,并且可以保持ASCII字符的可读性:

>>> from urllib.parse import quote, unquote
>>> quote('foo/../bar', safe='')
'foo%2F..%2Fbar'
>>> unquote(quote('foo/../bar', safe=''))
'foo/../bar'

safe设置为空字符串;默认值为'/',因此通常不会转义斜杠。

答案 1 :(得分:1)

您可以对用户提供的字符串进行URL编码。

根据Wikipedia article on Percent Encoding(它本身引用RFC 3986),唯一的URL安全字符是A-Z,a-z,0-9,破折号,下划线,点和波浪号(〜)。 Tilde在shell中有一个独特的解释,但它对于Linux文件名并不违法。

看起来像urllib(2)在Python中使用URL编码非常简单,但我不是Python程序员。

请参阅:URL encoding/decoding with Python