5

長い一日で、少し困惑しています。

ワイド文字の文字列がたくさん含まれているバイナリファイルを読んでいて、これらをPythonユニコード文字列としてダンプしたいと思います。(文字列以外のデータを解凍するには、structモジュールを使用していますが、文字列で同じことを行う方法はありません。)

たとえば、「シリーズ」という単語を読むと、次のようになります。

myfile = open("test.lei", "rb")
myfile.seek(44)
data = myfile.read(12)

# data is now 'S\x00e\x00r\x00i\x00e\x00s\x00'

その生のワイド文字データをPython文字列としてエンコードするにはどうすればよいですか?

編集:私はPython2.6を使用しています

4

4 に答える 4

8
>>> data = 'S\x00e\x00r\x00i\x00e\x00s\x00'
>>> data.decode('utf-16')
u'Series'
于 2010-04-30T17:31:30.970 に答える
3

rstripまた、アフターデコードを使用することをお勧めします。もちろん、必要がない場合を除いて、末尾の文字'\x00'をすべて削除します。'\x00'

>>> data = 'S\x00o\x00m\x00e\x00\x20\x00D\x00a\x00t\x00a\x00\x00\x00\x00\x00'
>>> print '"%s"' % data.decode('utf-16').rstrip('\x00')
>>> "Some Data"

結果がないrstrip('\x00')場合は、末尾にスペースがあります。

>>> "Some Data  "
于 2013-11-14T17:57:05.160 に答える
2

問題の文字列にFFを超える文字がないことがわかっている場合、ゼロバイトを削除することにより、Unicodeオブジェクトではなく文字列を生成する別の可能性があります。

>>> 'S\x00e\x00r\x00i\x00e\x00s\x00'[::2]
'Series'
于 2011-05-27T18:01:12.400 に答える
0

うーん、なぜ「ファイル」よりも「オープン」の方が好ましいと言うのですか?私はリファレンス(python 2.5)で見ます:

3.9ファイルオブジェクトファイルオブジェクトは、Cのstdioパッケージを使用して実装され、セクション2.1「組み込み関数」で説明されている組み込みコンストラクタfile()を使用して作成できます。3.6-----脚注(3.6)file( )はPython2.2の新機能です。古い組み込みのopen()は、file()のエイリアスです。

于 2010-05-01T21:19:14.713 に答える