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

时间:2017-03-02 20:43:03

标签: python json dictionary

我有一个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']

现在我打算将所有这些文件读入与filename或diff name同名的字典。然后遍历这些dict以找到公共密钥值对。

我做了以下操作来读取所有json文件到diff 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'}

2 个答案:

答案 0 :(得分:1)

有趣的问题......

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

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

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

所以这现在看起来像

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))

python代码执行以下操作

  1. 打开文件
  2. 读取文件
  3. JSON解析为Python词典
  4. 输出python Dictionary
  5. 所以这看起来像这样(Python3代码)

    sort | uniq -c | sort -n  
    

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

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

    所以把所有这些放在一起我们得到......(我假设所有的JSON都在我目前的同一目录中)

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

    如果你想要前五名 - 那就变成了

    {{1}}

答案 1 :(得分:1)

只在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 最后按值降序排序 print top element([0]),它是一个元组,因此它是[0] [0]和[0] [1]