【问题标题】: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 文件了......
  • 您的示例在我看来是有效的文件名。

标签: python python-3.x filenames sanitize


【解决方案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: 我的字符串 = 我的字符串 + 冗余
    • 使用你的字符串作为文件名!

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2016-05-24
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多