Python 3のバイト文字列変数を通常の文字列に変換するにはどうすればよいですか?


116

XMLメールの添付ファイルを読んだ

bytes_string=part.get_payload(decode=False)

変数名からわかるように、ペイロードはバイト文字列として送られます。

私は、推奨されるPython 3のアプローチを使用して、この文字列を操作可能な使用可能な文字列に変換しようとしています。

例は次のとおりです。

str(b'abc','utf-8')

b(bytes)キーワード引数を変数に適用してbytes_string、推奨される方法を使用するにはどうすればよいですか?

私が試した方法はうまくいきません:

str(bbytes_string, 'utf-8')

回答:


210

あなたはそれを最後の行でほぼ正しくしました。あなたが欲しい

str(bytes_string, 'utf-8')

のタイプはでbytes_stringあるため、のタイプとbytes同じですb'abc'


6
str(bytes_string, 'utf-8', 'ignore')3番目のパラメーターを渡すことにより、エラーを無視できます。
Shubhamoy

2
それはpylangの回答(無効な入力の処理に対処する)へのコメントであるように見えます。(とあなたが信じている)に何も問題がないbytes_string場合、なぜエラーを無視したいのですか?
Toby Speight

3
私はあなたのアプローチと、次のエラーを取得しています:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start bytestringバイト以下のためb'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
アルパース

@alper、それは有効なUTF-8文字列ではないので、何を期待していましたか?
Toby Speight

解決策をありがとう
Ajay Kumar

49

インスタンスを呼び出しdecode()て、bytesエンコードするテキストを取得します。

str = bytes.decode()

5
UnicodeDecodeError: 'utf-8'コーデックは位置230のバイト0xf6をデコードできません:無効な開始バイト
Juha Untinen

3
@JuhaUntinenエンコーディングはおそらくutf-8ではありません。
tommy.carstensen 2016

4
配列から非UTF8文字をフィルタリング(スキップ)する方法は?
Failov博士2016

9

更新しました:

b最初と最後に何も持たずに引用する

bytes変な状況でも文字列に変換する方法。

あなたのコードはエンコーディングに認識できない文字を持っているかもしれ'utf-8'ないので、追加のパラメータなしでstrだけを使う方が良いです:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

'utf-8'これらの特定のバイトにパラメーターを追加すると、エラーが発生します。

PYTHON 3規格が言うように、text今は心配せずにutf-8になります。


結果は "b '\\ x02-\\ xdfI#)'"です。これはおそらく彼が望んでいるものではありません
Glen Thompson

@GlenThompsonは、発生する可能性のある不要な条件の単なる例です。この特定のテキストは意図的に使用しています。テキストのb最初にインがあることを意味している場合は、回答を更新しました
Seyfi

非常にありがとう私はエンコードして文字を失うことなくansi文字を含む文字列のb ''を削除する方法を探していますインデックスの使用を開始:O
ディエゴフェルナンドムリーリョバレンシ2018

@DiegoFernandoMurilloValenci、どういたしまして。喜んでお手伝いできます。
Seyfi 2018年

6

配列から非UTF8文字をフィルタリング(スキップ)する方法は?

@ uname01の投稿とOPでこのコメントに対処するには、エラーを無視します。

コード

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

細部

docsから、同じerrorsパラメーターを使用した他の例を以下に示します。

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

エラー引数は、入力文字列がエンコードのルールに従って変換できない場合の応答を指定します。この引数の有効な値である'strict'(昇給UnicodeDecodeErrorの例外を)、 'replace'(使用U+FFFDREPLACEMENT CHARACTER)、または'ignore'(単にUnicodeの結果のうち文字を残します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.