读取许多json文件以找到公共键值对python

Posted

技术标签:

【中文标题】读取许多json文件以找到公共键值对python【英文标题】:read many json files to find common key value pair python 【发布时间】:2017-07-22 18:39:39 【问题描述】:

我有一个 json 文件的路径列表。

files = ['/Users/sbm/Downloads/ds214mb/sub-EESS001/sub-EESS001_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS002/func/sub-EESS002_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS003/sub-EESS003_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS004/func/sub-EESS004_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS005/sub-EESS005_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS006/sub-EESS006_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS007/func/sub-EESS007_task-Cyberball_bold.json',
 '/Users/sbm/Downloads/ds214mb/sub-EESS008/func/sub-EESS008_task-Cyberball_bold.json']

现在我打算将所有这些文件读入与文件名或差异名称同名的字典中。然后遍历这些 dict 以找到共同的键值对。

我执行以下操作来读取所有 json 文件以区分 dict。现在,比较所有这些 dict 以找到公共键:值对的有效方法是什么?

import json
for file in range(0, len(files)):
    globals()['json%s' % file] = "Hello"

i = 0
for file in files:
    globals()['json%s' % i] = json.loads(open(file).read())
    i = i+1

示例 json 文件如下所示:


 'Manufacturer': 'Siemens',
 'ManufacturerModelName': 'Magnetom Verio',
 'RepetitionTime': 1.56,
 'SliceTiming': [0.0,
  0.78,
  0.06,
  0.84,
  0.12],
 'TaskName': 'Cyberball'

【问题讨论】:

如果您可以将字典组织成一个列表,请查看其他答案:***.com/questions/9906944/… 看这里也许***.com/questions/25851183/… 【参考方案1】:

有趣的问题....

我从管道 JSON 文件列表开始 ....

find <dir> | grep json$ 

该管道被发送到 python 程序....

所以现在看起来像

find <dir> | grep json$ | python t.py

python 代码执行以下操作

    打开文件 读取文件 JSON 解析成 Python 字典 输出 python 字典

所以这看起来像这样(Python3 代码)

import json,sys,pprint
for file in sys.stdin:
  file=file.strip('\n')
  with open(file,"rt") as ifp:
    b=ifp.read()
    b=(b.replace('\n','')).replace("'","\"")
  ifp.close()
  c=json.loads(b)
  for k,v in c.items():
    print(':'.format(k,v))

我们现在使用 bash 对输出进行排序和计数...一般看起来像这样...

sort | uniq -c | sort -n  

因此,将所有这些放在一起,我们得到......(我假设所有 JSON 都在与我目前相同的目录中)

ls *.json | python t.py | sort  | uniq -c  | sort -n

如果你想要前 5 名 - 它就变成了

ls *.json | python t.py | sort  | uniq -c  | sort -n | head -n 5

【讨论】:

这里的问题是我打算在 python 中这样做 好的...我将发布一个完整的Python方式【参考方案2】:

仅在 python 中 - 没有 linux

files=['data1.json','data2.json','data3.json']
master_key_plus_value=
import json,sys,pprint
for file in files:
  with open(file,"rt") as ifp:
    b=ifp.read()
    b=(b.replace('\n','')).replace("'","\"")
  ifp.close()
  c=json.loads(b)
  for k,v in c.items():
    if str(k)+': '+str(v) in master_key_plus_value:
        master_key_plus_value[str(k)+': '+str(v)] += 1
    else:
        master_key_plus_value[str(k)+': '+str(v)] = 1

#Now we have ready all the key + values into a single dictionary
#Sort by the value (occurance)



master_key

sorted_dictionary = sorted(master_key_plus_value.items(), key=lambda x: -x[1])

print("Most Common Key-Value is   Occurance  ".format(sorted_dictionary[0][0],sorted_dictionary[0][1]))

同样的原则 对于每个文件 将 JSON 文件读取为文本 重新格式化并制作提供 python 字典的 Json 对象 组合键 + 值并与主字典进行比较 如果有,值加 1 别的 存储并将值设置为 1 最后按值降序排序 打印顶部元素 ([0]) 这是一个元组,因此它是 [0][0] 和 [0][1]

【讨论】:

以上是关于读取许多json文件以找到公共键值对python的主要内容,如果未能解决你的问题,请参考以下文章

在所有文件中找到JSON键,并删除相应的键值对。

如何在不干扰 iOS 中键值对序列的情况下读写 json 文件?

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

无法使用 Spark/Scala 从 JSON 嵌套键值对创建列和值

在 Spring Boot、Hibernate 中使用 @Query 注解以 JSON 格式(键值对)查询结果

文件中存在重复键值对时如何读取属性文件?