将句子保存为服务器文件名

时间:2017-11-28 10:22:17

标签: python python-3.x filenames sanitize

我将一组句子的录音保存到相应的一组音频文件中。

句子包括:

Ich weiß es nicht!
¡No lo sé! 
Ég veit ekki!

您如何建议我将句子转换为人类可读的文件名,稍后将在在线服务器上提供。我现在不确定将来会处理哪种语言。

更新

请注意,两个句子不能相互冲突。例如:

É bär icke dej.
E bår icke dej.

无法解析为相同的文件名,因为这些文件将互相覆盖。这是这里提到的slugify函数的问题:Turn a string into a valid filename?

我提出的最好的方法是使用urllib.parse.quote。但是我认为最终的输出比我希望的更难阅读。有什么建议吗?:

Ich%20wei%C3%9F%20es%20nicht%21
%C2%A1No%20lo%20s%C3%A9%21
%C3%89g%20veit%20ekki%21

2 个答案:

答案 0 :(得分:1)

unidecode怎么办?

import unidecode
a = [u'Ich weiß es nicht!', u'¡No lo sé!', u'Ég veit ekki!']
for s in a:
    print(unidecode.unidecode(s).replace(' ', '_'))

这提供了纯ASCII字符串,如果它们仍包含不需要的字符,则可以轻松处理。以下划线的形式保持空间不同有助于提高可读性。

Ich_weiss_es_nicht!
!No_lo_se!
Eg_veit_ekki!

如果唯一性存在问题,可能会在字符串中添加哈希或类似的东西。

修改

哈希似乎需要做一些澄清。许多散列函数是明确设计的,用于为近距离输入提供非常不同的输出。例如,python的内置哈希函数给出:

In [1]: hash('¡No lo sé!')
Out[1]: 6428242682022633791

In [2]: hash('¡No lo se!')
Out[2]: 4215591310983444451

有了这个,你可以做点什么

unidecode.unidecode(s).replace(' ', '_') + '_' + str(hash(s))[:10]

为了得到不太长的字符串。即使有这么短的哈希,冲突也不太可能。

答案 1 :(得分:0)

传统Unix / Linux文件名中唯一不允许的字符是斜杠(/ U+002F)和空字符(U+0000)。无需将示例人类可读的字符串转换为其他任何字符串。

如果您需要将文件提供给不使用相同文件名编码的系统,例如通过FTP或Web服务器下载,可能您希望将它们显式为UTF-8。在大多数现代的U * xes中,无论如何这应该是默认的开箱即用。这与您从urllib引用获得的结果相对应,其中百分比编码是生成机器可读明确表示的安全且合理的标准方式编码。如果您将这些内容嵌入到HTML或其他内容中,则可以使显示文本保持人类可读,并保持链接机器可读。

<a href="%C3%89g%20veit%20ekki%21">Ég veit ekki!</a>