2011-09-10 18 views
3

ファイルに書きたいユニコード文字列があります。Python 3.xでエンコードされた文字列を書き込みます。

のPython 2では、私は書くことができます:

open('filename', 'w').write(s.encode('utf-8')) 

をしかし、これは、Python 3で失敗したどうやら、s.encodeは()、ライト()関数は受け入れない 'バイト' タイプのものを返します:

TypeError: must be str, not bytes 

誰もが上記のコードをPython 3に移植する方法を知っていますか?

編集:

バイナリモードをご利用いただきありがとうございました!残念ながら、これは\ n文字に問題を引き起こします。 Python 2と同じ結果を達成するための方法はありますか?(つまり、OS固有の\ nを保持したまま、ANSI以外の文字をUTF-8でエンコードしますか?)

ありがとうございます!

答えて

2

オープンバイナリモードでファイルを、それは変化の中では、最も侵襲的な方法です。

一方、出力ファイルのエンコーディングをopen()で設定し、明示的な文字列エンコーディングを避けることができます。

open()機能のマニュアルをお読みください。

+0

この答えを受け入れることを選んだのは、Pythonの初心者で、2つの有効なオプションがあることを理解するためでした。** text **ファイルを使って作業しています。この場合、 'open () ''ファイル、または**バイナリ**ファイル(これは以前のものと非常に似ていますが(しかし、改行を扱うのにはいくつかの困難を引き起こしますが、私はそれらを扱う余裕があると思います)あまりにも)。今度は、** text **( 'str')と(binary)** data **(' bytes')を区別するPython 3.xの方法を知り、感謝しています。 – Tom

0

オープンバイナリモードでファイル

open('filename', 'wb').write(s.encode('utf-8')) 
+0

これはあまりにも多くのトラブルです。 – tchrist

10

あなたはではありませんそのような各データを手動でエンコードするのは大変です!あなたが作ったファイルは、あなたがそれを言うことがわかります、あなたならば今

#!/usr/bin/env python3.2 

slist = [ 
    "Ca\N{LATIN SMALL LETTER N WITH TILDE}on City", 
    "na\N{LATIN SMALL LETTER I WITH DIAERESIS}vet\N{LATIN SMALL LETTER E WITH ACUTE}", 
    "fa\N{LATIN SMALL LETTER C WITH CEDILLA}ade", 
    "\N{GREEK SMALL LETTER BETA}-globulin" 
] 

with open("/tmp/sample.utf8", mode="w", encoding="utf8") as f: 
    for s in slist: 
     print(s, file=f) 

を:単純にこのように、openに引数としてエンコーディングを渡し

$ cat /tmp/sample.utf8 
Cañon City 
naïveté 
façade 
β-globulin 

そして、あなたはそれらがあることがわかります正しいコードポイントは次のようになります。

$ uniquote -x /tmp/sample.utf 
Ca\x{F1}on City 
na\x{EF}vet\x{E9} 
fa\x{E7}ade 
\x{3B2}-globulin 

どれくらい簡単ですか。ストリームオブジェクトがあなたのために低レベルのエンコーディングまたはデコードを処理できるようにします。

概要:あなたがやっているすべては、同じエンコーディングで、それがすべてだ均質なストリームを処理するためにそれらを使用している場合encodedecode自分自身を呼び出さないでください。それはゼロ利得のためにあまりにも多くの気になります。 encoding引数を1回だけ使用してください。

+2

3.2で 'with'を使わない理由はありません。また、 'f.close()'ではなく 'f。閉じる。 – agf

+0

@agf Ug、そうです。このようなばかげたミスについてPythonに私に警告するにはどうすればいいですか? Perlでは、私は "無意味なコンテキストでの無用な使用"やそのようなものを得たでしょう。 – tchrist

+0

@Lennart:ありがとう、なぜそれは良いですか? 'f'のスコープ制御? – tchrist

関連する問題