JSON数组新元素识别后更新Excel无效果,如何修正代码?
排查JSON新增数据未写入Excel的问题
我之前也碰到过一模一样的情况!代码跑起来没任何报错,但Excel里的数据完全没变化,大概率是这几个环节出了问题,咱们一步步来排查修正:
1. 先确认唯一标识的判断逻辑没出错
这是最常见的坑,你得先确定用了稳定的唯一键来区分新旧用户(比如user_id、email这种不会重复的字段),要是用了update_time或者随机生成的临时字段,肯定会判断混乱。
- 检查对比逻辑有没有写反:比如是不是把「Excel里已存在的用户」当成了新增?正确的逻辑应该是如果JSON里的用户不在Excel列表里,才追加,别搞反了条件。
- 注意数据类型匹配:比如JSON里的
user_id是数字,Excel读出来变成了字符串,直接123 == "123"会返回False,导致误判成新增或者重复。解决办法是把两边的字段统一类型,比如都转成字符串:str(json_user['user_id']) == str(excel_user['user_id'])。
2. 检查Excel数据的读取是否完整
要是你读Excel的时候没读对,后续的对比全白搭:
- 如果你用
pandas的read_excel,要确认指定了正确的sheet名,比如pd.read_excel("users.xlsx", sheet_name="Sheet1"),不然读出来空表,所有数据都会被当成新增,但写入时没处理空表的话就没变化。 - 有没有处理表头?比如表头行被当成数据行读了,导致字段不匹配。可以加个
header=0参数确保第一行是表头。 - 另外,要是Excel文件里有很多空行,记得用
dropna(how='all')过滤掉,不然空行也会被算成现有数据。
3. 务必确认写入后正确保存了文件
这是最容易忽略的细节!
- 用
openpyxl操作的话,修改完必须调用wb.save("users.xlsx"),没这一步所有修改都是在内存里,根本没写到文件里。 - 用
pandas的话,追加数据要注意用对引擎和模式:比如pd.ExcelWriter要指定engine="openpyxl"和mode="a",否则会直接覆盖整个文件(但如果是首次写入,覆盖也没事,但追加时必须用mode="a")。 - 还有个坑:运行代码时别打开Excel文件!Windows下如果Excel处于打开状态,写入操作会静默失败(不会报错,但数据完全没保存),一定要关了Excel再跑代码。
4. 验证JSON里确实有新增数据
有时候不是代码的问题,是JSON数据本身没更新:
- 可以打印一下
len(json_data)和现有Excel的行数,再打印筛选出来的新增数据数量,比如new_users = [user for user in json_data if user not in existing_users],如果len(new_users)是0,那要么确实没新增,要么你的判断逻辑有问题。 - 手动挑一条JSON里的用户,去Excel里搜对应的唯一键,看看是不是已经存在了。
给你一个经过验证的示例代码(用pandas)
这个代码能避免很多常见问题,你可以参考调整:
import pandas as pd import json # 1. 读取每日更新的JSON数据 with open("daily_users.json", "r", encoding="utf-8") as f: json_users = json.load(f) # 2. 读取现有Excel数据,文件不存在则创建空表 try: df_existing = pd.read_excel("users.xlsx") # 统一唯一键类型(这里假设user_id是唯一标识) df_existing["user_id"] = df_existing["user_id"].astype(str) except FileNotFoundError: # 首次运行时创建空的DataFrame,列名根据你的JSON字段调整 df_existing = pd.DataFrame(columns=["user_id", "name", "email", "phone"]) # 3. 处理JSON数据,统一唯一键类型 df_new = pd.DataFrame(json_users) df_new["user_id"] = df_new["user_id"].astype(str) # 4. 筛选出Excel中不存在的新增用户(用merge比循环更高效) df_to_add = df_new.merge( df_existing, on="user_id", how="left", indicator=True ) # 只保留JSON里有但Excel里没有的用户 df_to_add = df_to_add[df_to_add["_merge"] == "left_only"] # 清理merge产生的冗余列 df_to_add = df_to_add.drop(columns=["_merge"] + [col+"_y" for col in df_existing.columns if col != "user_id"]) # 把列名恢复成原来的(merge后会加_x后缀) df_to_add.columns = [col.replace("_x", "") for col in df_to_add.columns] # 5. 追加到Excel文件 if not df_to_add.empty: # 如果是首次写入,需要写表头;否则追加时跳过表头 header = df_existing.empty with pd.ExcelWriter( "users.xlsx", mode="a", engine="openpyxl", if_sheet_exists="overlay" ) as writer: # 从现有数据的下一行开始写入 df_to_add.to_excel(writer, index=False, header=header, startrow=len(df_existing)) print(f"成功新增 {len(df_to_add)} 条用户数据") else: print("今日没有新增用户数据")
内容的提问来源于stack exchange,提问作者Leb_Broth
相关产品推荐
相关产品推荐

