“list indices must be integers or slices,not str”当从JSON操作数据时

fnvucqvd  于 2023-11-20  发布在  其他
关注(0)|答案(4)|浏览(111)

我试图从JSON文件中提取一些数据,这些文件都有相同的结构,然后将所选的数据写入一个新的JSON文件。我的目标是创建一个新的JSON文件,它或多或少是我的文件夹中每个JSON文件的数据列表:文件名,触发器数据,速度{imgVel,trigVel},坐标。
在我的程序的下一个步骤中,我将需要这个新的splitTest 1来分析不同文件的数据。
我有以下代码:

base_dir = 'mypath'
def createJsonFile() :
    splitTest1 = {}
    splitTest1['20mm PSL'] = []
    for file in os.listdir(base_dir):
        # If file is a json, construct it's full path and open it, append all json data to list
        if 'json' in file:
            json_path = os.path.join(base_dir, file)
            json_data = pd.read_json(json_path, lines=True)
            if splitTest1[file]['20mm PSL'] == to_find:
                splitTest1['20mm PSL'].append({
                    'filename': os.path.basename(base_dir),
                    'triggerdata': ['rawData']['adcDump']['0B'],
                    'velocity': {
                        'imgVel': ['computedData']['particleProperties']['imgVelocity'],
                        'trigVel': ['computedData']['img0Properties']['coordinates']},
                    'coordinates': ['computedData']['img1Properties']['coordinates']})
    print(len(splitTest1))

字符串
当我运行代码时,我得到这个错误:

'triggerdata': ['rawData']['adcDump']['0B'], TypeError: list indices must be integers or slices, not str


代码出了什么问题?我该如何修复?
这是我之前的代码,我如何访问数据,而不保存在另一个JSON文件:

with open('myJsonFile.json') as f0:
    d0 = json.load(f0)
y00B = d0['rawData']['adcDump']['0B']

x = np.arange(0, (2048 * 0.004), 0.004)  # in ms, 2048 Samples, 4us

def getData():
    return y00B, x

def getVel():
    imgV = d0['computedData']['particleProperties']['imgVelocity']
    trigV = d0['computedData']['trigger']['trigVelocity']
    return imgV, trigV


基本上,我尝试将最后一个代码片段放入一个循环中,该循环阅读文件夹中的所有JSON文件,并创建一个新的JSON文件,其中包含这些文件的名称列表和其他一些选定的数据(如['rawData']['adcDump']['0 B']等)

eblbsuwk

eblbsuwk1#

我假设你想做的是从几个json文件中获取一些数据,并将它们编译成一个列表,然后将其写入一个新的json文件。
为了从当前的json文件中获取数据,你需要在索引前面添加一个“引用”(否则代码不知道数据应该从哪里来)。像这样:

base_dir = 'mypath'
def createJsonFile() :
    splitTest1 = {}
    splitTest1['20mm PSL'] = []
    for file in os.listdir(base_dir):
        # If file is a json, construct it's full path and open it, append all json data to list
        if 'json' in file:
            json_path = os.path.join(base_dir, file)
            json_data = pd.read_json(json_path, lines=True)
            if splitTest1[file]['20mm PSL'] == to_find:
                splitTest1['20mm PSL'].append({
                    'filename': os.path.basename(base_dir),
                    'triggerdata': json_data['rawData']['adcDump']['0B'],
                    'velocity': {
                        'imgVel': json_data['computedData']['particleProperties']['imgVelocity'],
                        'trigVel': json_data['computedData']['img0Properties']['coordinates']},
                    'coordinates': json_data['computedData']['img1Properties']['coordinates']})
    print(len(splitTest1))

字符串
所以基本上你需要做的就是在索引前面添加“json_data”。
另外,我建议你把变量“json_path”而不是“base_dir”写进“文件名”字段。

yzxexxkh

yzxexxkh2#

我在Mattu 475的帖子的帮助下找到了解决方案
我不得不在索引前面添加引用,并使用以下代码更改如何打开文件夹中的文件;

with open (json_path) as f0:
   json_data = json.load(f0)

字符串
而不是pd.read_json(...)
下面是完整的代码:

def createJsonFile() :
    splitTest1 = {}
    splitTest1['20mm PSL'] = []
    for file in os.listdir(base_dir):
        # If file is a json, construct it's full path and open it, append all json data to list
        if 'json' in file:
            print("filename: " ,file) # file is only the file name, the path not included
            json_path = os.path.join(base_dir, file)
            print("path : ", json_path)
            with open (json_path) as f0:
                json_data = json.load(f0)
            splitTest1['20mm PSL'].append({
                'filename': os.path.basename(json_path),
                'triggerdata': json_data['rawData']['adcDump']['0B'],
                #'imgVel': json_data['computedData']['particleProperties']['imgVelocity'],
                'trigVel': json_data['computedData']['trigger']['trigVelocity'],
                #'coordinatesImg0': json_data['computedData']['img0Properties']['coordinates'],
                #'coordinatesImg1': json_data['computedData']['img1Properties']['coordinates']
            })
    return splitTest1


有几行(注解掉的那几行)还不能100%正常工作,但其余的都可以工作。

weylhg0b

weylhg0b3#

问题出在这条线上
第一个月
然后是后面的两个。这里发生的是你创建了一个列表,其中字符串“computedData”作为唯一的元素。然后试图找到索引“particleProperties”,这没有意义。你只能用整数索引列表。我真的不能给予你一个“解决方案”,但如果你想让imgVel只是这些字符串的列表,那么你可以这样做
'imgVel': ['computedData', 'particularProperties', 'imgVelocity']

e0uiprwp

e0uiprwp4#

你的dict值不是法律的Python。

'triggerdata': ['rawData']['adcDump']['0B']

字符串
这个值没有任何意义:你创建了一个字符串的列表,然后试图用另一个字符串索引它。你要求列表['rawData']的元素“adcDump”,但没有任何这样的语法。
您不能将任意源代码(您的部分表达式)存储为数据值。

相关问题