質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

Q&A

解決済

2回答

1028閲覧

Python3を使ってweb上から持ってきたファイル(16進数)をSJISに変換したい。

GTT

総合スコア9

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

0グッド

0クリップ

投稿2018/07/16 04:53

前提・実現したいこと

Python3を使ってweb上から持ってきたファイル(16進数)をSJISで変換したい。
16進数ファイルを読み込む際に以下のような文字化け?が起こりました。

発生している問題・エラーメッセージ

Bash上でcatコマンドで開いた場合

b'"\x8f\xd8\x96\xbe\x8b@\x8a\xd6\x93\x99\x8e\xed\x95\xca","\x8f\xd8\x96\xbe\x81i\x94F\x8f\xd8\x81j\x8e\xed\x95\xca"....(※ 長すぎるので割愛)

Python3上で以下のソースコードで開いた場合

'b\'"\x8f\xd8\x96\xbe\x8b@\x8a\xd6\x93\x99\x8e\xed\x95\xca","\x8f\xd8\x96\xbe\x81i\x94F\x8f\xd8\x81j\x8e\xed\x95\xca"....(※ 長すぎるので割愛)

該当のソースコード

Python3

1>>> f = open("binfile.log","r", encoding="utf-8") 2>>> str = f.read() 3>>> str 4>>> str.decode("sjis")

試したこと

encodingを変更したり、Python3で読み込んだ文字列を操作しようとしたが効果なし。
strの一文字一文字を確認したところ、

Python3

1>>> str 2'b\'"\x8f\xd8\x96\xbe\x8b@\x8a\xd6\x93\x99\x8e\xed\x95\xca","\x8f\xd8\x96\xbe\x81i\x94F\x8f\xd8\x81j\x8e\xed\x95\xca"....(※ 長すぎるので割愛) 3>>> str[0] 4'b' 5>>> str[1] 6"'" 7>>> str[2] 8'"' 9>>> str[3] 10'\' 11>>> str[4] 12'x' 13>>> str[5] 14'8' 15>>> str[6] 16'f' 17>>> str[7] 18'\'

といった風に、
str[0]とstr[1]の間の''が存在していない
str[3]は''で一文字になっている

補足情報(FW/ツールのバージョンなど)

環境

  • Python 3.5.2
  • WSL

補足が必要でしたら、ご教示ください。

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

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

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

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

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

efcode

2018/07/16 14:07

「\x??」の??をバイト列に入れてdecodeしてあげればsjisの「'"証明機関等種別..」というような文字列は得られるはずですが、もう少しプログラミングのベースを理解してからでないと難しいと思います。
guest

回答2

0

ベストアンサー

プログラミン入門したての人にはやや難しいかも。
そのファイルは、シフトJISの文字列をPythonでの文字列として表現したものです。
evalするのがいいでしょう(もっと適切な関数があるかも知れません)。

Python

1f = open("binfile.log","r", encoding="utf-8") 2str = f.read() 3str = eval(str) 4print(str.decode("sjis"))

投稿2018/07/16 05:14

otn

総合スコア84538

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

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

GTT

2018/07/16 18:01

大変勉強になりました。 ご教示頂いたとおり、evalを使えばうまくいきました!! Pythonが面白く感じれました! エンジニアではありませんが、日々の業務で楽しく使っていきたいと思います。
guest

0

エスケープの\がそのまま表示されているだけで、文字列としてはちゃんと読み込めています。

元のデータは16進数ファイルというか、pythonのbytes型を文字列で表現したもので、ファイル自体は普通のテキストなのでしょう(文字コードまではわからないけど。utf-8を指定して読めてるなら、utf-8?)。

なんとかデコードできないか色々試してみて、けっきょくうまく行かなかったので(努力次第でできなくはないと思う。大変なだけで。気が向いたらもう少しやってみます)、otnさんの回答のようにevalするのが一番楽だと思います。

binfile.logを作るときにbytesをstrに変換する処理がどこで走ってるんだと思いますが、そこでちゃんとdecode("sjis")すれば最初から普通に書き込まれてお得です。可能ならそちらを検討してください。binfile.logそのものをネットから拾ってきてるなら、仕方ありませんが・・・

投稿2018/07/16 11:53

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問