用于筛选JSON对象中包含特定值的数组的Python脚本

用于筛选JSON对象中包含特定值的数组的Python脚本,python,arrays,json,Python,Arrays,Json,我有一个json对象,它由一个带有键“data”的对象组成,该对象的值列在一组数组中。我需要返回所有包含值x的数组,但是数组本身没有键。我正在尝试编写一个脚本来输入源文件(infle)和定义导出文件(outFile)。以下是我的数据结构: { "data": [ ["x", 1, 4, 6, 2, 7], ["y", 3, 2, 5, 8, 4], ["z", 5, 2, 5, 9, 9], ["x", 3, 7, 2, 6, 8]

我有一个json对象,它由一个带有键“data”的对象组成,该对象的值列在一组数组中。我需要返回所有包含值x的数组,但是数组本身没有键。我正在尝试编写一个脚本来输入源文件(infle)和定义导出文件(outFile)。以下是我的数据结构:

{ "data": [
       ["x", 1, 4, 6, 2, 7],
       ["y", 3, 2, 5, 8, 4],
       ["z", 5, 2, 5, 9, 9],
       ["x", 3, 7, 2, 6, 8]
     ]
}
这是我目前的剧本:

import json

def jsonFilter( inFile, outFile ):
    out = None;

    with open( inFile, 'r') as jsonFile:
       d = json.loads(json_data)
       a = d['data']
       b = [b for b in a if b != 'x' ]
       del b
       out = a


    if out:
        with open( outFile, 'w' ) as jsonFile:
            jsonFile.write( json.dumps( out ) );

    else:
       print "Error creating new jsonFile!"
解决方案

谢谢罗布和所有人的帮助!这是最后一个可用的命令行工具。这需要两个参数:inFile和Outfile.~$python jsonFilter.py infle.json outFile.json

import json

def jsonFilter( inFile, outFile ):
    # make a dictionary.
    out = {};

    with open( inFile, 'r') as jsonFile:
       json_data = jsonFile.read()
       d = json.loads(json_data)
       # build the data you want to save to look like the original
       # by taking the data in the d['data'] element filtering what you want
       # elements where b[0] is 'x'
       out['data'] = [b for b in d['data'] if b[0] == 'x' ]


    if out:
        with open( outFile, 'w' ) as jsonFile:
            jsonFile.write( json.dumps( out ) );

    else:
       print "Error creating new JSON file!"

if __name__ == "__main__":
     import argparse

     parser = argparse.ArgumentParser()
     parser.add_argument('inFile', nargs=1, help="Choose the in file to use")
     parser.add_argument('outFile', nargs=1, help="Choose the out file to use")
     args = parser.parse_args()
     jsonFilter( args.inFile[0] , args.outFile[0] );

第一个问题,查询字符串对所有内容都是真的(也称为返回整个数据集,因为您正在将b(列表)与“x”字符串进行比较)

  b = [b for b in a if b != 'x' ]
你想做的是:

  b = [b for b in a if b[0] != 'x' ]
第二个问题是您试图通过查询和删除结果来删除数据。因为结果包含的副本不会从原始容器中删除任何内容。
相反,只使用您想要的元素构建新数据,并保存这些元素。此外,您没有在out数据中重新创建“data”元素,因此json的输出与输入数据具有相同的结构

import json

def jsonFilter( inFile, outFile ):
    # make a dictionary instead.
    out = {};

    with open( inFile, 'r') as jsonFile:
       json_data = jsonFile.read()
       d = json.loads(json_data)
       # build the data you want to save to look like the original
       # by taking the data in the d['data'] element filtering what you want
       # elements where b[0] is 'x'
       out['data'] = [b for b in d['data'] if b[0] == 'x' ]


    if out:
        with open( outFile, 'w' ) as jsonFile:
            jsonFile.write( json.dumps( out ) );

    else:
       print "Error creating new jsonFile!"
输出json数据如下所示:

 '{"data": [["x", 1, 4, 6, 2, 7], ["x", 3, 7, 2, 6, 8]]}'
 '[["x", 1, 4, 6, 2, 7], ["x", 3, 7, 2, 6, 8]]'
如果您不希望输出具有“data”根元素,而只希望输出与筛选器匹配的数据数组,请更改行:

 out['data'] = [b for b in d['data'] if b[0] == 'x' ]

通过此更改,输出json数据如下所示:

 '{"data": [["x", 1, 4, 6, 2, 7], ["x", 3, 7, 2, 6, 8]]}'
 '[["x", 1, 4, 6, 2, 7], ["x", 3, 7, 2, 6, 8]]'

因此,基本上,您希望过滤掉包含第一个元素为“x”的数组的输入数据,也许类似这样的操作可以:

import json


def jsonFilter(inFile, outFile):
    with open(inFile, 'r') as jsonFile:
        d = json.loads(json_data)

        out = {
            'data': filter(lambda x: x[0] == 'x', d['data'])
        }

        if out['data']:
            with open(outFile, 'w') as jsonFile:
                jsonFile.write(json.dumps(out))
        else:
            print "Error creating new jsonFile!"

这不是一个有效的JSON对象;JSON没有集合,集合也不能包含列表。请显示JSON数据的实际内容。
out
是否总是
None
?另外,您是否有任何错误?您希望发生什么?我的错误,在简化代码的同时,我向jsonFile.write()提供了错误的变量并且json的结构不正确。很抱歉,json文件是400MB(每个数组包含40+个值),所以我不得不将它缩小一点。“x”总是在索引(0)中在每个数组中,如果有帮助的话。@DGaffneyDC可以,但是您得到的输出是什么,以及它与预期的输出有什么不同?我希望返回一个JSON文件,其中包含索引(0)位置上值为“x”的所有数组。因此,本质上过滤第一个对象,使其仅包含{data:[[[“x”,1,4,6,2,7],“x”,3,7,2,6,8]}这成功了!一个小小的调整-在d=json.loads(json_数据)之前添加json_data=jsonFile.read()。除此之外,我要找的就是钱。谢谢@Rob!@DGaffneyDC Gald我可以帮忙。.read()行上的oopsy。.一定是意外删除了该行,它已修复。:)