将句子另存为服务器文件名
Posted
技术标签:
【中文标题】将句子另存为服务器文件名【英文标题】:Save sentence as server filename 【发布时间】:2018-05-11 18:22:00 【问题描述】:我正在将一组句子的录音保存到相应的一组音频文件中。
句子包括:
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
【问题讨论】:
您是否有必要从“转义”文件名中重建确切的原始名称?否则我想你可以为冲突添加后缀......无论如何,我知道这不是你的问题,但你可能想要考虑一个更防弹的解决方案,比如使用一些 UUID 作为文件名并在一个相关的句子文件/数据库/任何东西。我发现很难想象一个坚如磐石的算法能够处理任何类型的 Unicode 输入。 unix.stackexchange.com/questions/38055/utf-8-filenames 如果这个答案是正确的,为什么不按原样写出句子呢?如果您想将它们用于不允许使用非 ascii 字符的目的,您可以在那时转换它们。 不确定您的需求,但如果这涉及到来自例如英语的翻译,您是否可以将文件命名为<sentence>_<language>
(例如 I don't know_de_DE
)?
@GVH: 非 ASCII 文件名一旦你尝试与不同的系统交换它们就是一场噩梦,更不用说 zip 文件了......
您的示例在我看来是有效的文件名。
【参考方案1】:
传统 Unix / Linux 文件名中唯一不允许使用的字符是斜杠 (/
U+002F) 和空字符 (U+0000)。无需将您的示例人类可读字符串转换为其他任何内容。
如果您需要将文件提供给不使用相同文件名编码的系统,例如通过 FTP 或从 Web 服务器下载,您可能希望将它们显式公开为 UTF-8。在大多数现代 U*xes 上,无论如何这应该是开箱即用的默认设置。这将对应于您从urllib
引用获得的结果,其中百分比编码是一种安全且合理的标准方式,可以生成机器可读和明确表示编码。如果您将这些嵌入到 html 或其他东西的 sn-p 中,您可以保持显示文本人类可读,而只保持链接机器可读。
<a href="%C3%89g%20veit%20ekki%21">Ég veit ekki!</a>
【讨论】:
【参考方案2】: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内置的hash函数给出:
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]
为了得到不太长的字符串。即使使用如此缩短的哈希值,也不太可能发生冲突。
【讨论】:
如何使用哈希来区分“¡No lo sé!”和“¡不败!”? 对我的回答进行了澄清。 我需要在我的问题中指定的文件名是可读的。这是因为它让我很容易找到一个文件。例如,如果我需要修复一个包含故障的文件,我想在文件系统中轻松找到该文件。 作为哈希的替代方法,您可以创建一个仅包含被替换字符的字符串,将它们转换为 base64,然后附加它。我认为保证不会发生碰撞。虽然碰撞不太可能开始,但无论如何。您还可以事先使用os.file.exists()
检查是否存在冲突,并在必要时省略唯一标识符。【参考方案3】:
您可能应该尝试将空格转换为另一个符号,使您的字符串看起来像 É-bär-icke-dej。
如果你使用 python 我会这样做。
用 (-) 或 (/) 等其他符号替换空格 mystring.replace('','-')使用检测编码的python 包chardet 检测您的字符编码。
使用 python 解码你的字符串
mystring.decode(*检测到的编码*) 检查文件名是否在您的目录中已经使用python的OS包。像 files = os.listdir(*目录路径*) //获取文件名重复了多少次 冗余 = 0 对于文件中的名称: 如果 mystring 在名称中: 冗余+=1 将冗余添加到您的字符串 如果冗余!= 0: 我的字符串 = 我的字符串 + 冗余 使用你的字符串作为文件名!希望这会有所帮助!
【讨论】:
以上是关于将句子另存为服务器文件名的主要内容,如果未能解决你的问题,请参考以下文章
如何将图片另存为从 windows phone 7 到服务器的文件路径
Node.js:将 Android-Base64 编码图像另存为文件