🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

215閲覧

str型として登録されているバイト配列のデータを文字として表示したい

taro_daiwa

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/07 01:40

編集2020/01/07 02:18

str型として登録されているバイト配列のデータを文字として表示する方法を教えて頂けますでしょうか。

あまりあり得ないパターンとは思いますが、データベースの 文字列型 のカラムにこのように入っておりまして、
取り出した時にstr型で取得されて中身が分からないので一括変換を試みております。

単純にbytes型の場合は下の通りにencodeすれば表示できたのですが、
元データが文字型の場合はどう前処理をすれば良いでしょうか?ハマってしまいました。。

OK

1hoge = b'\xe5\xbb\x8a\xe4\xb8\x8b' 2print(type(hoge)) 3print(str(hoge,encoding='utf-8',errors='replace')) 4 5<class 'bytes'> 6廊下

NG

1#元データが文字型の場合 2hoge = "b'\xe5\xbb\x8a\xe4\xb8\x8b'" 3???? 4上記のOKの場合と同じようにすると 5printのところで 6TypeError: decoding str is not supported 7エラーとなります。

どなたかご助言の程よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/01/07 01:48

NG側でも 廊下 という出力が欲しいということでしょうか? そもそもそんなことをしなければならない状況の方が間違っているんじゃ、という気しかしなくて、なんでそんなことをする羽目になっているのか? を書いてもらった方がいいかと。 (ただの興味だと言われたら、全く興味が持てない質問でしたので)
taro_daiwa

2020/01/07 01:55

早速の返信ありがとうございます。 そうです。NG側でも廊下というような形で出力したいです。 こうなった経緯まではよく分からないのですが、 現在データベースの中に文字列として上記のようなデータがたくさん入っておりますので、 まずはそれを読めるように一括変換しようと試みています。
quickquip

2020/01/07 02:05

データベースの **文字列型** のカラムにそう入っていて、str型でそう取得されてしまうということですかね……。 恒久的にそうしておくのではなくて、一括で修正するような書き捨てのスクリプトを組んでいる最中、ということならまぁ理解できます。 (y_waiwaiさんの回答のコメントでも進行していますが)回答に必要そうな情報は、質問を編集して随時追記していく方がいいですよ。
taro_daiwa

2020/01/07 02:23

ご助言ありがとうございます。追記しました。 そうなんですよ。**文字列型** の中に何故かバイト型のデータが入っておりまして扱いに苦慮してます。 回答も頂けたのでなんとかなりそうです。ありがとうございました。
guest

回答2

0

ベストアンサー

print(hoge)

ですと下記のようにそのまま文字列として表示されました。
b'\xe5\xbb\x8a\xe4\xb8\x8b'

それならば、ast.literal_evalを利用できそうです。

Python

1import ast 2 3# この場合raw文字列を使った方が現状を正確に再現できるでしょう 4hoge = r"b'\xe5\xbb\x8a\xe4\xb8\x8b'" 5print(type(hoge)) 6print(hoge) 7 8fuga = ast.literal_eval(hoge) 9print(type(fuga)) 10print(str(fuga, encoding='utf-8', errors='replace'))

実行結果 Wandbox

<class 'str'> b'\xe5\xbb\x8a\xe4\xb8\x8b' <class 'bytes'> 廊下

投稿2020/01/07 02:07

LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_daiwa

2020/01/07 02:25

ast.literal_evalとかあるのですね。 全く知らなかったので一生解決できないところでした。 助かりました。これでなんとかしてみます。 本当にありがとうございました。
guest

0

それそのままで表示できるんでは。
どうなる?

投稿2020/01/07 01:42

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_daiwa

2020/01/07 01:52

早速の返信ありがとうございます。 そのまま表示しようとした場合は下記のエラーが表示されてしまいます。 print(str(hoge,encoding='utf-8',errors='replace'))のところで 「TypeError: decoding str is not supported」となります。
y_waiwai

2020/01/07 01:55

print(hoge) ではどうなります?
taro_daiwa

2020/01/07 02:03

print(hoge) ですと下記のようにそのまま文字列として表示されました。 b'\xe5\xbb\x8a\xe4\xb8\x8b'
y_waiwai

2020/01/07 02:17

あああ、そのまんまで文字列になるのねw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問