【PY】根据 Excel 中的指示修改 JSON 数据

·  阅读 2043

本文正在参加「金石计划 . 瓜分6万现金大奖」

前言

继上一次友友问了如何处理 Excel 中的数据之后,这次他又遇到了新问题,让我们一起来看看;

image.png

根据 Excel 中的指示,把旧的 json 中的内容改成新的 json 中的内容,那接下来且看博主娓娓道来;

如果对处理 Excel 中的数据感兴趣的小伙伴,可以看看之前的文章:【PY】pandas 处理 Excel 中错别字修正

读入 Excel

因为要对 Excel 中的数据进行读取,首先想到的就是 pandas 的包,那接下来我们将用到这几个来自 pandas 中的函数以及属性:

  • read_excel():读入 Excel 文件;
  • columns:查看数据表中的列名称;
  • values:查看数据表中的数值;

1、首先,导入 pandas 的包:

import pandas as pd
复制代码

2、读入相关 Excel 的数据,观察一下大致情况:

data = pd.read_excel("1.xlsx")
data
复制代码

image.png

3、然后看一下列标题:

data.columns
复制代码
Index(['context', 'role_id', 'resource'], dtype='object')
复制代码

4、再看看单行的数据值:

data.loc[0].values
复制代码

image.png

按照友友的说法,需要根据 role_id,将新 json 中的内容替换到旧 json 中去;

到这里,读入 Excel 就完工了,我们接下来根据 role_id 处理一下 JSON 中的数据就行了;

处理 JSON

要处理 JSON 的话,想必要将 JSON 的数据导入,在处理完成之后,还要重新导出,因此,这里将用到 json 包,以及其中的两个函数:

  • dumps():将 Python 对象编码成 JSON 字符串;
  • loads():将已编码的 JSON 字符串解码为 Python 对象;

两个函数的实例可以参考菜鸟教程,下面将直接使用;

1、获取文件的路径;

image.png

这里的话使用到了 os.getcwd(),即获取到当前文件的位置,

image.png

因此,能够写出两个文件夹里的文件的路径了:

old_path = f"{os.getcwd()}/old/{data.loc[0].values[2]}"
new_path = f"{os.getcwd()}/new/{data.loc[0].values[2]}"
复制代码

2、依次读入文件:

这里就使用 json.loads() 将 JSON 文件加载进来;

with open(old_path, "r") as f:
    old_content = json.loads(f.read())
    print("old json:\n", old_content)

with open(new_path, "r") as f:
    new_content = json.loads(f.read())
    print("new json:\n", new_content)
复制代码

在查取单行数据的时候,发现是 role_id 在12的位置有问题,看一下输出的结果,果真如此:

image.png

3、修改旧 JSON 文件的内容;

根据上述,我们只需要将新值覆盖到旧值上就行了:

old_content['对话过程'][data.loc[0].values[1]-1]['text'] = new_content['对话过程'][data.loc[0].values[1]-1]['text']
复制代码

image.png

4、导出 JSON 文件;

这里用到的是 json.dumps()

with open(old_path, 'w') as f:
    json.dumps(old_content, f, indent=4, ensure_ascii=False)
复制代码

TIPS

上述已经完成了单次处理 JSON 数据的情况,如何把所有都修改完就是留给友友的思考了;

在 for 循环时需要注意一个问题,那就是需不需要判断是否为同一个 JSON 文件

  1. 如果不进行判断的话,那就一次遍历就要完成读写两个操作,会比较浪费资源,以及相对来说速度较慢;
  2. 如果需要进行判断的话,有一种方法就是需要两个指针来进行辅助,伪代码如下:
    data = pd.read_excel("1.xlsx")
    start = data.loc[0].values[2]
    flag = False
    for index in data.index:
        cur = data.loc[index].values[2]
    
        if start != cur:
            with open(..., 'w') as f:
                json.dump(content, f, indent=4, ensure_ascii=False)
            flag = False
            start = cur
    
        if not flag:
            with open(..., 'r') as f:
                content = json.loads(f.read())
            flag = True
    
        ...
    复制代码

后记

以上就是 根据 Excel 中的指示修改 JSON 数据 的全部内容了,讲解了如何通过 pandas 包来读入 Excel,以及如何处理 JSON 数据,结合实际场景,具体问题具体分析,图文并茂,细致的讲解了操作过程以及其中需要注意的细节,希望大家有所收获!

📝 上篇精讲:【PY】pandas 处理 Excel 中错别字修正

💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注;

👍 创作不易,请多多支持;

🔥 系列专栏:PY

收藏成功!
已添加到「」, 点击更改