2016-12-21 3 views
0

ファイルのTweetオブジェクトの配列を保存しようとしています。 Tweetクラスのインスタンスには、utf8エンコード文字が含まれています。"UnicodeDecodeError: 'charmap'コーデックは、ピクルスロードのエラーを解読できません。

class Tweet: 
    author=''; 
    text=''; 
    time=''; 
    date=''; 
    timestamp=''; 

with open('tweets.dat','wb') as f: 
    pickle.dump(all_tweets,f) 

with open('tweets.dat') as f: 
    all_tweets = pickle.load(f) 

私は、コードを実行すると、それはpickle.load上の例外を返します(f)のように述べてライン:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 25: character maps to <undefined> 

マイマシン仕様:

を、あなたは以下のコードを見ることができます

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32

+0

なぜあなたは、バイナリモードでファイルに書き込み、テキストモードで、それから読んでいますか? –

+0

オブジェクトを取得して使用したいと考えています。ここでは簡単な例を挙げましたが、Tweetクラスには非テキスト属性も含まれています。 – CoderInNetwork

+0

書き込み時には 'DAT'ファイル全体を置き換えますが、外部のエンコーディング/デコードシステムで使用したい場合は、このファイルを作成する際にどのデコードが使用されたか覚えていましたか? 。ほとんどの答えは「いいえ! 、cos、 'os_encoding'、' python encode'、 'python decode'パターン? – dsgdfg

答えて

4

Python 3では、pickleモジュールは、基礎となるファイルオブジェクトが受け入れるか、バイトを返すことを期待しています。書き込みのためにバイナリモードで正しくファイルを開きますが、読み取りには同じことをしませんでした。読み取り部分には、次のようになります。

with open('tweets.dat', 'rb') as f: 
    all_tweets = pickle.load(f) 

参考:pickle.load(fd)の文書からの抜粋:

...Thus file can be an on-disk file opened for binary reading, an io.BytesIO object, or any other custom object that meets this interface.

+0

ありがとうございます。残念ながら、それは動作しません。 "AttributeError:" – CoderInNetwork

+0

@CoderInNetworkの "Tweet"属性を取得できません:[mcve]を追加するために質問を編集する必要があります。私はあなたの質問に現在表示されているもの(ASCII以外のデータを使用しているもの)のわずかに修正されたオブジェクトでテストし、うまくいきました。 Pickleはよく知られていてよくテストされたモジュールであり、使用方法を正確に知ることができません。私たちはあなたを助けることができません。 –

+0

あなたは正しいです。コードは正常に動作します。ありがとう – CoderInNetwork

関連する問題