【问题标题】:More efficient way to make unicode escape codes制作 unicode 转义码的更有效方法
【发布时间】:2016-09-12 11:49:43
【问题描述】:

我正在使用 python 为 Qualtrics 在线调查自动生成 qsf 文件。 qsf 文件要求使用 \u+hex 约定转义 unicode 字符:'слово' = '\u0441\u043b\u043e\u0432\u043e'。目前,我正在使用以下表达式实现这一点:

'слово'.encode('ascii','backslashreplace').decode('ascii')

输出正是我需要的,但由于这是一个两步过程,我想知道是否有更有效的方法来获得相同的结果。

【问题讨论】:

  • 哪个python版本?
  • @Ni。我正在使用 python 3
  • 如果您发现自己经常这样做,只需编写一个非常简短的函数来为您完成。除非有令人信服的理由,否则不要担心效率。

标签: python python-3.x unicode character-encoding


【解决方案1】:

如果您以“wb”形式打开输出文件,则它接受字节流而不是 unicode 参数:

s = 'слово'
with open('data.txt','wb') as f:
    f.write(s.encode('unicode_escape'))
    f.write(b'\n')  # add a line feed

这似乎是你想要的:

$ cat data.txt
\u0441\u043b\u043e\u0432\u043e

它避免了解码以及将 unicode 写入文本流时发生的任何翻译。


根据@J.F.Sebastian 的建议更新为使用 encode('unicode_escape')。

%timeit 报告说它比 encode('ascii', 'backslashreplace') 快很多:

In [18]: f = open('data.txt', 'wb')

In [19]: %timeit f.write(s.encode('unicode_escape'))
The slowest run took 224.43 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 1.55 µs per loop

In [20]: %timeit f.write(s.encode('ascii','backslashreplace'))
The slowest run took 9.13 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.37 µs per loop

In [21]: f.close()

奇怪的是,encode('unicode_escape') 的 timeit 延迟比 encode('ascii', 'backslashreplace') 的延迟要长得多,即使每个循环时间更快,所以一定要在你的环境。

【讨论】:

  • 请注意,一旦将文件作为字节流打开,就不能再向其中写入常规的 Unicode 字符串(没有编码)。
  • 在这种情况下这是一件好事。 @bebob 说文件格式需要 unicode 转义,因此任何在未指定转义编码的情况下写入文件的尝试都会引发错误。
【解决方案2】:

我怀疑这是您应用程序的性能瓶颈,但s.encode('unicode_escape') 可能比s.encode('ascii', 'backslashreplace') 快。

为避免手动调用.encode(),您可以将编码传递给open()

with open(filename, 'w', encoding='unicode_escape') as file:
    print(s, file=file)

注意:它也翻译不可打印的 ascii 字符,例如,换行符写为\n,制表符写为\t,等等。

【讨论】:

  • print(s, file=file)\n 放入文件而不是换行符。
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 2014-01-20
  • 2021-12-26
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多