2011-09-12 8 views
1

イムtweepyで機能を使用しようと、「update_profile_background_image」とエラーが出ていますUnicodeDecodeError(tweepy)

Traceback (most recent call last): 
    File "XXX.py", line 1401, in <module> 
    psn_card.gen_twitter_bg(user_db) 
    File "XXX.py", line 972, in gen_twitter_bg 
    auth_api.update_profile_background_image(file) 
    File "build/bdist.linux-x86_64/egg/tweepy/api.py", line 346, in update_profile_background_image 
    headers, post_data = API._pack_image(filename, 800) 
    File "build/bdist.linux-x86_64/egg/tweepy/api.py", line 729, in _pack_image 
    body = '\r\n'.join(body) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal not in range(128) 

問題がある:このlibに卵のファイル内にある、私はこの問題を解決する方法? これはtweepyのバグですか?

この機能は、ファイル(画像)を読み込み、POST(HTTP)経由でTwitter APIに送信する機能です。

エラーは、ロードしたイメージを操作しようとした時点で発生します。

# -- coding: utf-8 -- 
+1

詳細をご覧ください。 update_profile_background_image()の呼び出しはどうなりますか?エラーがあるかもしれませんが、まだわかりません。 – naeg

+0

一般的なリンク:http://docs.python.org/howto/unicode.html – Carpetsmoker

答えて

4

私の推測では、filenameは、Unicode文字列であるということである:すべての私の.py

は、UTF-8を使用するように構成されています。残念ながら、TweepyはUnicodeのファイル名をサポートしていません。これはバグですか?間違いなく

問題は、それが代わりにバイト文字列にそれをエンコードするの、逐語的にUnicode文字列を使用してHTTP POSTデータを作成しようとしている:これはbody、リスト内の1つの文字列Unicode文字列を作る

body.append('Content-Disposition: form-data; name="image"; filename="%s"' % filename) 

、シーケンス内の1つの文字列がUnicode文字列で、join()にしようとすると、結果はUnicodeになります。しかし、HTTP POST本体は、バイナリgunkがロードされたバイト文字列であるため、ASCII互換ではないため、暗黙的にUnicodeに変換しようとします。

(いずれにしても、Content-Dispositionで指定されたファイル名には完全なパスが含まれている必要はありません。上記のコードのように、filename= os.path.basename(filename).encode('us-ascii', 'ignore')のようなものをお勧めします。しかし、Twitterでもファイル名のことを気にしていない...)