如何在Python 3.7+tkinter中验证所选文件为合法JSON格式?
如何验证选中的文件是合法JSON格式(Python Tkinter)
你现在的代码已经实现了.json后缀的筛选,但确实没法区分“后缀是.json但内容不是JSON”的情况——其实解决这个问题的核心就是尝试解析文件内容,因为Python的json模块在解析非法JSON时会抛出特定的异常,我们只要针对性捕获这个异常就可以了。
核心改进点
原来的except Exception太笼统,会把所有错误都归为“未选择文件”,我们需要拆分异常捕获,区分以下几种场景:
- 用户根本没选文件(或者文件路径无效)
- 文件后缀是.json,但内容不是合法JSON
- 其他意外错误(比如文件权限问题)
修改后的完整代码
from tkinter import * import tkinter as tk from tkinter import ttk, messagebox # 补上messagebox的导入 import os import json import csv from tkinter.filedialog import askopenfilename def JsonFormat(): name = askopenfilename( initialdir="../Path/For/JSON_file", filetypes=(("Json File", "*.json"), ("All Files", "*.*")), # 修正原代码的括号语法错误 title="Choose a file." ) # 先判断用户是否选择了文件 if not name: messagebox.showerror("Error Message", "未选择文件") return try: # 直接用json.load从文件对象解析,比先read再loads更高效 with open(name, 'r', encoding='utf8') as f: parsed_json = json.load(f) # 格式化并写入 formatted_json = json.dumps(parsed_json, indent=4, sort_keys=True) with open(name, 'w', encoding='utf8') as f: f.write(formatted_json) messagebox.showinfo("Information","JSON文件已格式化完成") except json.JSONDecodeError as e: # 捕获JSON解析错误,说明内容不是合法JSON messagebox.showerror("错误", f"该文件不是合法的JSON格式:\n{e}") except PermissionError: messagebox.showerror("错误", "没有文件读写权限") except Exception as e: # 兜底处理其他未知错误 messagebox.showerror("错误", f"发生未知错误:\n{e}")
关键改动说明
- 修正了
filetypes的语法错误:原代码里的括号位置不对,会导致文件类型筛选失效 - 提前判断文件选择状态:当用户在文件对话框点取消时,
askopenfilename会返回空字符串,提前判断可以避免后续无效操作 - 针对性捕获异常:
json.JSONDecodeError:这是判断非法JSON的核心——只要解析失败抛出这个异常,就说明文件内容不符合JSON规范,不管后缀是什么- 单独捕获
PermissionError:给用户更明确的权限提示 - 最后用
Exception兜底:处理其他意料之外的错误,同时展示错误信息方便排查
测试场景验证
- 选一个改了.json后缀的txt文件(内容是普通文本):会弹出提示“该文件不是合法的JSON格式”
- 选合法的JSON文件:正常格式化并提示成功
- 打开对话框后点击取消:提示“未选择文件”
- 选一个没有读写权限的文件:提示“没有文件读写权限”
内容的提问来源于stack exchange,提问作者user




