You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动