web-dev-qa-db-ja.com

Pythonでの酸洗いエラー?

このエラーが発生しましたが、その意味がわかりません。この問題を解決するにはどうすればよいですか?

私のコードは次のようになります。以前に使用したことがあり、機能しました。

parentdir = os.getcwd()
dirlist = os.listdir(parentdir)

for dir in dirlist:
    if not dir == "pubs_edits": continue
    if os.path.isdir(os.path.join(parentdir, dir)):
                        os.chdir(os.path.join(parentdir, dir))
                        file_list = os.listdir(os.path.join(parentdir, dir))
                        for f in file_list:
                            in1 = open(f, 'r')
                            dict2 = pickle.load(in1)

これはエラーメッセージです:

    File "/home/md202/pmid_editor.py", line 18, in <module>
        dict2 = pickle.load(in1)
    File "/usr/lib/python2.5/pickle.py", line 1370, in load
        return Unpickler(file).load()
    File "/usr/lib/python2.5/pickle.py", line 858, in load
        dispatch[key](self)
KeyError: '\x00'
15
marsx

この正確なエラーは、Djangoを介してデータベースに保存した文字列表現を(pickle.loadsを使用して)pickle化しようとしたときに発生しました。 Django pickle.loads(mystring)がエラーをスローするように、文字列の文字表現を変更しました。明示的な文字列変換を追加すると、問題ありませんでした:pickle.loads( str(mystring) )

編集:元の投稿のコメントを見ると、これは言及されたユニコード文字列の問題に関連していると思います。通常の文字列をデータベースに入れましたが、Djangoは、このエラーを生成するUnicode文字列を返します。

13
Matt

同様の問題が発生し、_KeyError: '\x1f'_が発生しました。

私の場合、ifがgzipファイル(つまり:gzip.open(fileName,'wb'))にピクルス化されていて、通常のファイルオブジェクト(つまり:open(fileName,'rb'))で読み取ろうとしていました。

4
drevicko

Pickleはバイナリなので、そのように読む必要があります。 ( 'r')の代わりに( 'rb')読み取りバイナリを使用してみてください。また、ファイルを作成する場合は、pickleファイルもバイナリ(「wb」)として作成していることを確認してください。それはうまくいくはずです、それが役立つことを願っています。

2
JayLav

試してみてください

pickle.loads()

1
nZeeR