如何使用Python在多份JSON文件中查找指定value对应的文件与行号
需求说明
- 现有5个JSON文件,命名分别为
JSON1.json、JSON2.json、JSON3.json、JSON4.json、JSON5.json,通用格式如下:
{ "flower": { "price": { "type": "good", "value": 5282.0, "direction": "up" } }, "furniture": { "price": { "type": "comfy", "value": 9074.0, "direction": "down" } } }
- 需求:接收用户输入的数值,查找所有JSON文件中
value字段等于该数值的位置,输出对应JSON文件名和行号,预期输出效果示例:
Enter the value: 9074 该值存在于JSON日志文件JSON1的第12行
原有代码问题
你编写的代码存在以下问题:
- 重复编写5次文件读取逻辑,代码冗余扩展性差,后续新增JSON文件需要手动添加代码
- 语法不符合Python规范:
int i = 0;、i++、item(i+1)都是其他编程语言的写法,Python不支持该类语法 - 直接使用
json.load将JSON转为Python字典,丢失了原始文件的行号信息,无法实现行号输出需求 - 没有处理输入类型:用户输入的内容是字符串类型,JSON中的value是浮点型,直接比较永远无法匹配
正确实现代码
import re # 预定义要遍历的JSON文件列表,后续新增文件只需修改这个列表即可 json_files = [f"JSON{i}.json" for i in range(1, 6)] # 匹配value字段的正则,提取后面的数值,自动兼容数值前后的空格 value_pattern = re.compile(r'"value"\s*:\s*(\d+\.?\d*)') # 获取用户输入,转成浮点型兼容整数、小数输入 user_input = input("Enter the value: ") try: target_value = float(user_input) except ValueError: print("输入的不是有效数值,请重新运行程序") exit() # 遍历所有JSON文件 for file_name in json_files: try: # 逐行读取文件,同时记录行号(行号从1开始计数) with open(file_name, 'r', encoding='utf-8') as f: for line_num, line_content in enumerate(f, start=1): # 匹配当前行的value值 match_res = value_pattern.search(line_content) if match_res: current_value = float(match_res.group(1)) if current_value == target_value: print(f"该值存在于JSON日志文件{file_name.split('.')[0]}的第{line_num}行") except FileNotFoundError: # 忽略不存在的文件,避免程序崩溃 continue
实现说明
- 用列表推导式批量生成待遍历的JSON文件名,不需要重复编写文件读取逻辑
- 逐行读取文件的同时用
enumerate记录行号,解决了json.load丢失行号的问题 - 用正则匹配提取每行
value对应的数值,自动兼容数值前后的空格、带不带小数点的格式 - 提前对用户输入做类型转换,避免字符串和数值比较不匹配的问题
- 加了异常捕获,输入非法数值、文件不存在都不会导致程序崩溃
内容的提问来源于stack exchange,提问作者sherkhan
相关产品推荐
相关产品推荐

