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

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

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

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Q&A

解決済

1回答

6086閲覧

対処方法:a bytes-like object is reuired, not dict

pokemonta

総合スコア170

ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

0グッド

0クリップ

投稿2020/04/05 05:49

編集2020/04/05 05:50

jsonファイルを読み込み、バイナリで出力するプログラムを
書きました。しかしながら、標記のエラーが出てうまくいきません。
どのように解消すればよろしいでしょうか
また、jsonのバイナリ変換のアプローチは以下のようで良いのでしょうか
(1文字ずつ取得して、encodeするのかや16進数に変えるのやら。いまいち勘所がありません。)

python

1import json 2 3f = open('sample.json', 'r') 4json_dict = json.load(f) 5 6# バイナリモードでファイルに書き込み 7f = open('test.dat', 'wb') 8f.write(json_dict) 9 10# バイナリモードでファイル読み込み 11f = open('test.dat', 'rb') 12data = f.read() 13 14print(data) 15

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の手順で json オブジェクトをバイナリに変換してから、書き込めばよいと思います。

  1. json.dumps() で json オブジェクトを str に変換する。
  2. str.encode(エンコード形式) で str をバイナリに変換する。

python

1import json 2 3with open("sample.json", "r") as f: 4 json_dict = json.load(f) 5 6# バイナリモードでファイルに書き込み 7with open("test.dat", "wb") as f: 8 json_str = json.dumps(json_dict) 9 json_bin = json_str.encode("utf-8") 10 f.write(json_bin) 11 12# バイナリモードでファイル読み込み 13with open("test.dat", "rb") as f: 14 json_bin = f.read() 15 16print(json_bin)

追記

Python 2系と3系で文字列の扱いは大きく異るので、WEb 上の情報を参照する際はどのバージョンの話なのかをご注意ください。

Python2とPython3のstr型/unicode型/bytes型/encode/decodeの違い解説 - Qiita

Python 3では文字列は内部的に unicode で管理されている str 型で表されます。
この str をテキストにする際には、ascii や utf-8 といったエンコード方式でバイナリ化します。
open() でモードを "w" にしてエンコード方式を指定して書き込むのと、
str.encode() でバイナリにしてから、モードを "wb" にしてバイナリとして書き込むのは同じ意味です。

python

1text = "ハローワールド" 2 3with open("sample.txt", "w", encoding="utf-8") as f: 4 f.write(text) 5 6with open("sample2.txt", "wb") as f: 7 f.write(text.encode("utf-8"))

jsonは、文字なのでasciiなので、シンプルにバイナリ(byte型に変換できる)

json は ascii 以外の文字 (日本語とか) も含められるので、その場合、"utf-8" とかその文字を含む文字コードを使う必要があります。
どの文字コードでエンコードするかは利用者が決めることなので、bytes オブジェクトにしたい場合は str.encode() で明示的に変換する必要があります。

バイナリって人間が読めない形式だと思っていましたが、outputは普通に読める形式でしたが。。

テキストもバイナリです。
テキストエディタで開いたときに文字として表示されるのは、テキストエディタが文字コードを判断して、バイナリを解釈しているからです。
間違った文字コードで解釈すると、正しく文字として認識できず、文字化けが発生します。

投稿2020/04/05 06:03

編集2020/04/05 06:24
tiitoi

総合スコア21956

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

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

pokemonta

2020/04/05 06:09

ご回答ありがとうございます。 いろんな記事を読みますとstrやらutf-8やら、encodeやら、辞書やらでてきますが これらとjson、バイナリはどのような関係にあるのでしょうか 【私の考え】 jsonは、文字なのでasciiなので、シンプルにバイナリ(byte型に変換できる) byte(変数,'utf-8')、変数.encode、b'変数'の3パターン?
pokemonta

2020/04/05 06:15

バイナリって人間が読めない形式だと思っていましたが、outputは普通に読める形式でしたが。。
pokemonta

2020/04/05 06:22

-----------------------------input { "objectA":{ "height": 158 , "position": "abc" }, "objectB":{ "height": 157 , "position": "xyz" } } -----------------------------output b'{"objectA": {"height": 158, "position": "abc"}, "objectB": {"height": 157, "position": "xyz"}}' 確かにbがついているのでバイナリですね。なんかイメージと違いました。 人間が読めない形で、1文字当たりを表現するバイト数が減るみたいな。。
tiitoi

2020/04/05 06:25

追記しました。 bytes にする際は、文字コードを指定してエンコードする必要があります。
pokemonta

2020/04/05 08:00

辞書型→文字列→バイト列に変換しているということですね。 辞書型→バイト列にはできない。 文字列→バイトへはエンコードの指定が必要。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問