2016-05-16 5 views
3

私は、Qualthonオンライン調査のためにpythonを使ってqsfファイルを自動的に生成しています。 qsfファイルでは、 'слово' = '\ u0441 \ u043b \ u043e \ u0432 \ u043e'という規約を使用してユニコード文字をエスケープする必要があります。現在、私は次の式でこれを実現しています:ユニコードエスケープコードをより効率的に作成する

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

出力は私が必要とする正確に何であるが、これは2段階のプロセスであるため、同じ結果を得るために、より効率的な方法がある場合、私は疑問に思いました。

+0

どのpythonバージョンですか? –

+0

@ Ni。私はPython 3を使用しています – reynoldsnlp

+0

あなたがこれを頻繁にやっていることがわかったら、あなたのためにそれを行うための非常に短い関数を書いてください。説得力のある理由がない限り、効率を心配しないでください。 –

答えて

3

あなたが「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が、それはかなり速くエンコード( '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

関連する問題