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

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

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

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

561閲覧

pythonスクリプトでdel文を使いたい

DaichiYasuda

総合スコア173

JSON

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/11/08 16:21

編集2017/11/08 16:25

jsonファイルを読み込んで特定の要素を削除したい。

test.pyファイル

python

1import json 2 3f= open('./json/20171105-000617.json', 'r') 4result = json.load(f) 5print(result) 6del result[0]['faceRectangle'] 7print(result)

出力結果

# python test.py [ { "faceId": "XXXXXXXXXXXXXXXXXXXXXx", "faceRectangle": { "width": 179, "top": 113, "height": 179, "left": 181 }, "faceAttributes": { "gender": "male", "age": 17.1 } } ] Traceback (most recent call last): File "test.py", line 6, in <module> del result[0]['faceRectangle'] TypeError: 'unicode' object does not support item deletion

faceRectangleの要素を削除してprintしたいのですが失敗しています。
del文はスクリプト内では使えないのでしょうか??

ご教示お願い致します。

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

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

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

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

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

LouiS0616

2017/11/08 16:42 編集

何らかの理由で、resultの型がユニコード文字列になっているようです。Win10 + Python3.6ですが、再現できませんでした。もう少し詳しくOSやPythonのバージョンなどの環境を書くと、わかる方が答えてくださるかもしれません。また、.jsonファイルのエンコードも書くとなお良いでしょう。
guest

回答2

0

ベストアンサー

print(result)の結果が"辞書型を含んだリスト"をprintしたものに見えません。ファイルの中身がそのまま出てしまってますね。

s = u"""[ { "faceId": "XXXXXXXXXXXXXXXXXXXXXx", "faceRectangle": { "width": 179, "top": 113, "height": 179, "left": 181 }, "faceAttributes": { "gender": "male", "age": 17.1 } } ]""" import io, json f = io.StringIO(s) result = json.load(f) print(result) [{u'faceId': u'XXXXXXXXXXXXXXXXXXXXXx', u'faceRectangle': {u'width': 179, u'top': 113, u'left': 181, u'height': 179}, u'faceAttributes': {u'gender': u'male', u'age': 17.1}}]

json.loadが正しく実行されているならこんな感じに見えるはずです(最後の行)。

python

1import json 2 3print(json.__file__) 4 5f= open('./json/20171105-000617.json', 'r') 6result = json.load(f) 7print(result) 8del result[0]['faceRectangle'] 9print(result)

にして、jsonの正体を調べたいですね。本当に標準ライブラリを読みこんでいるんでしょうか?

投稿2017/11/08 22:23

編集2017/11/09 12:18
quickquip

総合スコア11029

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

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

KSwordOfHaste

2017/11/08 23:36

エラーメッセージから配列の要素はdictではなくstrであることは確実な気がするのでなんらかの理由でloadの結果がこうなったと仮定するとprint結果はむしろ ['{\n...}'] つまり改行文字がエスケープされて表示されるはずではないかと思えました。要素がdictであれstrであれ質問文にあるような形式で出力されるケースがわかりません(設定によってはあり得るのでしょうか?)。 いずれにせよまずjsonの正体が疑わしいというquiquiさんのご指摘はごもっともであると感じました。
quickquip

2017/11/08 23:41

私の回答の、上のコードの後で `print(s)` すると、質問の様な出力になりますよね。疑っているのはそういう状況(を引き起こすようなjson.pyがある? 可能性)です。
mkgrei

2017/11/08 23:52

確かに出力の形が不思議ですね。ただ、それだとresult[0]['faceRectangle']の方で、先にIndexErrorかKeyErrorが出るはずなんです。
KSwordOfHaste

2017/11/09 00:02 編集

あ!type(result)==strのとき、result[0]もstrなんですね!失礼しました。 pythonの仕様を他の言語の仕様とごっちゃにしてました。 >>> del 'aaa'[0]['abc'] Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> del 'aaa'[0]['abc'] TypeError: 'str' object does not support item deletion こうなりますね!(2.7, 3.6ともに)
quickquip

2017/11/09 00:05

> KSwordOfHaste さん はい。想定しているのはその状況です。質問ではunicodeですが事情は一緒ですね。
mkgrei

2017/11/09 00:31

本当ですね。jsonの方に問題があるのは間違いなさそうです。delする前に要素にアクセスできるのかをチェックすべきでした。 先にdeletionに関するエラーが出るのはpythonの仕様ですか?
mkgrei

2017/11/09 00:44

出るべきKeyErrorがないのは、pythonドキュメントの以下の警告に伴う副作用という認識で正しいでしょうか?(本題とは関係ありませんが) 以下引用: https://docs.python.org/ja/3/reference/datamodel.html 警告 __del__() メソッドの呼び出しが起きるのは不安定な状況下なので、 __del__() の実行中に発生した例外は無視され、代わりに sys.stderr に警告が出力されます。また、 (例えばプログラムの実行終了による) モジュールの削除に伴って __del__() が呼び出される際には、 __del__() メソッドが参照している他のグローバル変数はすでに削除されていたり、削除中(例えば、import機構のシャットダウン中)かもしれません。この理由から、 __del__() メソッドでは外部の不変関係を維持する上で絶対最低限必要なことだけをすべきです。
quickquip

2017/11/09 02:25 編集

参照するべきは http://docs.python.jp/3/reference/datamodel.html#object.__delitem__ こちらでしょう。 del hoge[...] 形式の呼び出しは、 hoge.__getitem__(...) が成功するかどうかをチェックせずに、 hoge.__delitem__(...) をコールするようです。 class D(object): ..def __delitem__(self, key): ....print(type(key)) ....print(key) a = D() del a['hogehoge'] で <type 'str'> hogehoge が確認できます。
mkgrei

2017/11/09 11:14

勉強になりました。 惜しいのは高評価を一度しか押せないところですね。
DaichiYasuda

2017/11/13 15:50

json.loadしたファイルをもう一度json.loadしていました。。。
guest

0

以下の指摘は今回の質問に対しては正しくありません。
quiquiさんの回答を参考にしてください。
一応残しておきます。


LouiS0616さんが指摘されているとおり、文字コード周りのトラブルです。
Mac上だと、python2.7.12、python3.5.2ともに再現できません。

文字コード周りが大きく修正されてpython3.xでは再現できない気がします。(嘘かな?)
修正の理由がご質問にあるようなトラブルが頻繁に起こった過去にあるわけだが。

Windows上のpython2.x、もしくはエンコードを変えたLinuxとか。

いずれにしろコードの頭におまじないを忘れずにつけるか、python3.xを使用することをおすすめします。

python

1# coding: UTF-8

投稿2017/11/08 17:40

編集2017/11/09 00:48
mkgrei

総合スコア8560

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

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

LouiS0616

2017/11/08 17:48

Python2.7.13 + Win10でも再現しませんでした。 また、jsonファイルのエンコードを変更すると、json.loadでValueErrorが出ます。 ちょっと変わった環境なのかもしれないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問