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

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

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

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

Python

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

Q&A

解決済

1回答

1302閲覧

【python】jsonファイルの差分確認時にカンマが理由で差分検出されてしまう

aaaki

総合スコア1

Python 3.x

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

Python

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

0グッド

2クリップ

投稿2023/01/04 11:12

編集2023/01/04 11:21

用意したjsonファイルを'difflib'を用いて差分抽出

json:Data1.json

1{ 2 "テキストA": "テキストa", 3 "テキストB": "テキストb", 4 "テキストC": "テキストc", 5 "テキストD": "テキストd", 6 "テキストE": "テキストe" 7}

json:Data2.json

1{ 2 "テキストZ": "テキストz", 3 "テキストA": "テキストa", 4 "テキストB": "テキストb", 5 "テキストC": "テキストc", 6 "テキストD": "テキストd" 7}

Data1.jsonとData1.jsonをもとに上に行を追加 + 追加した行の数だけ下から削除した、
Data2.jsonを比較して以下のように差分を抽出しました。

python

1import os 2import difflib 3 4path1 = 'Data1.jsonのパスを指定' 5path2 = 'Data2.jsonのパスを指定' 6 7file1 = open(path1) 8file2 = open(path2) 9diff = difflib.Differ() 10 11output_diff = diff.compare(file1.readlines(), file2.readlines()) 12 13for data in output_diff : 14 15 if data[0:1] in ['+', '-'] : 16 print(data) 17 18file1.close() 19file2.close() 20 21# 以下 抽出された内容 22# + "テキストZ": "テキストz", 23# - "テキストD": "テキストd", 24# + "テキストD": "テキストd" 25# - "テキストE": "テキストe"

実際に抽出したい内容は、- "テキストZ": "テキストz",+ "テキストE": "テキストe"のみですが、
末尾のカンマの影響により- "テキストD": "テキストd" + "テキストD": "テキストd",は一致していても差分として抽出されてしまいます。

対応策として以下を思いつきましたがそれぞれ問題がありました。
①jsonファイルの末尾にカンマを追加する → 文法上良くない
②最終行のみ差分が一致しなくても抽出しないようにする → カンマ以外に差異がある場合も無視してしまう

同じようなつまずきよくある気がしたため検索してみましたが同様の問題見つからず、
一応、一度抽出した差分に対して, - +を置換してから再度差分抽出する方法は思いつきましたが、コードが複雑になり一般的な方法のようには思えませんでした。

こちらについてよくある問題な気がするため一般的な表記方法やメソッドなどがあるようでしたらお伺いしたく質問させていただきました。
ご回答のほどよろしくお願いいたします。

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

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

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

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

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

maisumakun

2023/01/04 11:20

そもそも論ですが、行単位で評価する必要はあるのでしょうか? (JSONは行区切りに意味がある訳では無いフォーマットです)
aaaki

2023/01/08 12:52

わかりづらくすいません。 行単位ではなく、JSONファイル全体を比較したときの差分項目を抽出したいという意図でした。 たとえば`"テキストD": "テキストd"`の項目は`Data1.json`では5行目に`Data2.json`では6行目ですが、全体で見ると含まれているため差分抽出したくなかったです。 また差分抽出をそもそも利用したかった理由は、既存データから更新されたデータのみに別途処理をしたかったためです。 melianさんがご回答いただいた方法で意図した通り動きましたのでベストアンサーとさせていただきました。 ご質問いただきありがとうございました。
guest

回答1

0

ベストアンサー

python

1import os 2import json 3 4path1 = 'Data1.json' 5path2 = 'Data2.json' 6 7with open(path1, 'r') as f: 8 js1 = json.load(f) 9 10with open(path2, 'r') as f: 11 js2 = json.load(f) 12 13d1 = set(js1.items()) 14d2 = set(js2.items()) 15diff = d1 ^ d2 16print(diff) 17 18# {('テキストZ', 'テキストz'), ('テキストE', 'テキストe')}

投稿2023/01/04 11:48

melian

総合スコア19805

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

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

aaaki

2023/01/08 12:37

ご回答いただきありがとうございました! 初心者のため集合を使って差分を操作することができることを知りませんでした。 これであれば差分を適切に抽出できるので助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問