首页 > 解决方案 > 遍历和连接 json 中的值

问题描述

我有一个 json 文件,我正在尝试迭代以加入其中的文件路径,但我一直遇到问题:

{
  "files": [
    {
      "name": "Mississippi",
      "folder": "H:\\Data\\Mississippi",
      "zFeatures": [
        {
          "name": "Land_Use",
          "file": "MS_LandUse.shp",
            }
          ]
        }
      ]
    }

在这种情况下,我想加入filefolder所以我的输出将是:"H:\\Data\\Mississippi\\MS_LandUse.shp"。我确实有数百个其他文件也需要加入,所以我需要遍历这个 json。

我试过自上而下迭代,但失败了

with open("filoc.json", "r") as i:
    filoc = json.load(i)

for files in filoc['files']:
    for folder in files['folder']:
        for zFeatures in files['zFeatures']:
        #This is where I'm stumped, I feel like I'm already doing it wrong.

标签: pythonjson

解决方案


你在做某事。很遗憾,您没有确切说明您的问题是什么。首先,让我更正 JSON 数据(它已损坏):

{
  "files": [
    {
      "name": "Mississippi",
      "folder": "H:\\Data\\Mississippi",
      "zFeatures": [
        {
          "name": "Land_Use",
          "file": "MS_LandUse.shp"
        }
      ]
    }
  ]
}

然后,您可以通过以下方式组合os.path.joinos.path.abspath加入并确保路径正确:

import os, json

with open("test.json", "r") as i:
    filoc = json.load(i)

for file_info in filoc['files']:
    print(os.path.abspath(os.path.join(file_info['folder'], file_info['zFeatures'][0]['file'])))

这假设在zFeaturestho 下只有一个文件。如果有多个,只需执行以下操作:

for file_info in filoc['files']:
    for f_obj in file_info['zFeatures']:
        print(...(file_info['zFeatures'][f_obj]['file']))

但我假设这个 blob 是每个文件的。

最后,当心os.path.abspath - 如果在 Linux 机器上传递一个 windows 路径 - 它会生成一个不稳定的路径。如果路径是混合的,请跳过abspath()并希望路径没有混合或正确。


推荐阅读