2017-11-13 2 views
1

heroprotocolというPythonライブラリをPython 2からPython 3に移植しようとしています。このライブラリは、ファイルからデータを取得する目的で、Heroes of the Stormというオンラインゲームの再生ファイルを解析するために使用されます誰がいつ死んだのか、いつゲームが終わったのか、誰が勝ったのかなど)。Python 2からPython 3への移植でord()が失敗するのはなぜですか?

私が午前特定の問題がある

をこのライブラリはPython 2のために作成されたようだ、と私は、Python 3(特にアナコンダ、Jupyterノートブック)を使用しておりますので、私は、Python 3に変換したいと思います私はをググ

TypeError: ord() expected string of length 1, but int found 

:私はリプレイファイルに関するいくつかの基本的なデータを取得する必要がありますどの

header = protocol.decode_replay_header(mpq.header['user_data_header']['content']) 

を実行したとき、私はこのエラーを取得することPython 3でord()の使い方についていくつかの記事を見つけましたが、私が抱えている問題は解決していませんでした。私もGithubの "Issues"セクションでpostingを試しましたが、まだ回答がありません。

このエラーはなぜ発生しますか?

答えて

2

issueあなたが上げによると、例外がline 69 of decoders.pyで発生します

self._next = ord(self._data[self._used]) 

これは、Python 2での成功が、Pythonの3で失敗する明白な理由はself._dataがバイト文字列であるということです。 Pythonの2では1にそのインデックスがその位置(自身の文字列)にある文字を返しますので、バイト文字列が...、

# Python 2.7 
>>> b'whatever'[3] 
't' 

「標準」の文字列オブジェクトである...と期待通りの結果にord()を呼び出すと、動作します。

>>> ord(b'whatever'[3]) 
116 

しかし、Python 3では、everything is different:標準の文字列オブジェクトはUnicode文字列であり、バイト文字列は代わりに整数のシーケンスです。このため、バイト文字列にインデックスを付けることは直接関係の整数を返すので、整数にord()を呼び出すことは意味がありません...

# Python 3.6 
>>> b'whatever'[3] 
116 

は...:

だから、
>>> ord(b'whatever'[3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: ord() expected string of length 1, but int found 

、あなたはを防ぐことができるはずあなたは、単にそれと類似したライン上ord()への呼び出しを削除することによって、ここについて求めている特定の例外:

self._next = self._data[self._used] 

...もちろん、この問題の範囲外のさらなる問題が結果として明らかになる可能性はありますが。

関連する問題