2016-05-16 3 views
3

Я использую python для автоматического создания qsf файлов для онлайн-опросов Qualtrics. Файл qsf требует, чтобы символы Unicode были экранированы с использованием соглашения \u+hex: 'слово' = '\ u0441 \ u043b \ u043e \ u0432 \ u043e'. В настоящее время я достичь с помощью следующего выражения:Более эффективный способ создания escape-кодов unicode

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

Выход именно то, что мне нужно, но так как это двухступенчатый процесс, я задавался вопросом, есть ли более эффективный способ, чтобы получить тот же результат ,

+0

эта версия на основе python? –

+0

@Ni. Я использую python 3 – reynoldsnlp

+0

Если вы часто это делаете, просто напишите очень короткую функцию, чтобы сделать это за вас. Не беспокойтесь об эффективности, если нет веских оснований для этого. –

ответ

3

Если открыть выходной файл как «термометр», то он принимает поток байт, а не юникод аргументы:

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_escape') в соответствии с предложением @ J.F.Sebastian.

% timeit сообщает, что это совсем немного быстрее, чем закодировать ('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() 

Любопытно, что отставание от timeit для кодирования ('unicode_escape') намного длиннее чем от encode ('ascii', 'backslashreplace'), даже если время в петле быстрее, поэтому обязательно проверяйте как в своей среде.

+0

Просто следует предупредить, что как только вы откроете файл в виде потока байтов, вы больше не сможете писать обычные строки Unicode (без кодирования). –

+0

В этом случае это хорошо. @bebob говорит, что для формата файла требуются экраны unicode, поэтому любая попытка записать в файл без указания экранированной кодировки вызовет ошибку. – Neapolitan

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 и т.д.

+0

'print (s, file = file)' помещает '\ n' в файл, а не в строку. – Neapolitan

+0

@Neapolitan: прочитайте примечание (последнее предложение в ответе). – jfs

Смежные вопросы