Python 制作unicode转义码的更有效方法

Python 制作unicode转义码的更有效方法,python,python-3.x,unicode,character-encoding,Python,Python 3.x,Unicode,Character Encoding,我正在使用python为Qualtrics在线调查自动生成qsf文件。qsf文件要求使用\u+hex约定对unicode字符进行转义:“Сааа”='\u0441\u043b\u043e\u0432\u043e'。目前,我通过以下表达来实现这一点: 'слово'.encode('ascii','backslashreplace').decode('ascii') 输出正是我所需要的,但由于这是一个两步过程,我想知道是否有更有效的方法来获得相同的结果。如果以“wb”打开输出文件,则它接受字节流

我正在使用python为Qualtrics在线调查自动生成
qsf
文件。
qsf
文件要求使用
\u+hex
约定对unicode字符进行转义:“Сааа”='\u0441\u043b\u043e\u0432\u043e'。目前,我通过以下表达来实现这一点:

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

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

如果以“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”,“反斜杠替换”)快很多:


奇怪的是,尽管每循环时间更快,但从timeit到encode(“unicode_escape”)的延迟比从encode(“ascii”,“backslashreplace”)到timeit的延迟要长得多,所以一定要在您的环境中测试这两种情况。

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

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


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

哪个python版本?@Ni。我正在使用Python3如果您发现自己经常这样做,只需编写一个非常简短的函数即可。除非有令人信服的理由,否则不要担心效率。请注意,一旦以字节流形式打开文件,就不能再向其写入常规Unicode字符串(不进行编码)。在这种情况下,这是一件好事@bebob说,文件格式需要unicode转义,因此任何在不指定转义编码的情况下写入文件的尝试都会引发错误。
print(s,file=file)
\n
放在文件中,而不是放在换行符中。
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()
with open(filename, 'w', encoding='unicode_escape') as file:
    print(s, file=file)