欢迎光临
我们一直在努力

Python 字典与 JSON 文件读写全指南|从基础语法到持久化字符统计实战

目录

前言

一、Python 基础数据类型总览

二、字典(dict)核心基础规则

2.1 字典定义格式

2.2 两条硬性语法红线(必记)

2.3 字典的设计特点

三、字典四大遍历方式

实战:字符统计字典(统计字符串每个字符出现次数)

四、字典增删改查全套内置方法

4.1 修改 / 新增键值

4.2 删除元素

4.3 安全取值

4.4 快速创建字典

4.5 类型转换创建字典

五、JSON 序列化与文件持久化(字典落地本地文件)

5.1 核心概念区分

5.2 写入 JSON 文件两种写法

方式 1:dumps 先转字符串,再 write 写入

方式 2:dump 直接写入(with 上下文管理器,自动关闭文件,推荐)

5.3 读取 JSON 文件两种写法

方式 1:loads 读取文本后解析

方式 2:load 直接读取文件(推荐)

六、JSON 文件高频报错避坑指南(你之前踩过的全部问题)


前言

字典(dict)是 Python 最核心的键值对容器,也是处理结构化数据、对接 JSON 文件的基础。日常开发里,字符统计、配置存储、接口数据解析、本地文件持久化都离不开字典 + JSON 组合。本文结合完整代码案例,一次性讲清字典底层规则、遍历、增删改查 API,以及 JSON 序列化 / 反序列化文件读写避坑要点。

一、Python 基础数据类型总览

Python 内置基础数据分为两大类:

  • 单值类型(不可变) int整数、float浮点数、str字符串、bool布尔值
  • 容器序列类型
    • list列表:有序可变数组,用数字下标取值
    • tuple元组:有序不可变数组,元素无法修改
    • dict字典:无序键值对映射,通过键快速检索(本文核心)

    二、字典(dict)核心基础规则

    2.1 字典定义格式

    字典使用大括号{}包裹,格式 {键: 值, 键2: 值2},键和值支持绝大多数数据类型,但有严格限制。

    python

    运行

    obj = {
    2: 1, # int 做键
    3.4: 3.14, # float 做键
    True: 666, # bool 做键
    "key1": 10, # str 最常用键
    "key2": "shuxudong",
    "key3": [1, 1, 3, 45], # 值可以是列表
    (): 23, # 元组(不可变)可以做键
    "addr": "无"
    }

    2.2 两条硬性语法红线(必记)

  • 键必须是「不可变类型」 ✅ 合法键:int/float/str/tuple ❌ 非法键:list列表、dict字典(可变,运行直接报错)

    python

    运行

    # 报错示例,禁止使用
    obj = {[]: 55, {}: 66}

  • 键不能重复 若定义重复键,只会保留最后一个重复键的值,前面同名键会被直接覆盖:

    python

    运行

    obj = {"key2": "shuxudong", "key2": "shu"}
    print(obj) # 输出 {'key2': 'shu'}

  • 2.3 字典的设计特点

    字典底层哈希表实现,通过键直接取值速度极快;代价是占用更多内存空间,属于「牺牲存储、换取查询速度」的数据结构。

    三、字典四大遍历方式

    遍历是业务高频操作,三种标准遍历 API 分别对应「只拿键、只拿值、同时拿键值」:

    python

    运行

    obj = {"h":0, "e":0, "l":0, "o":0}

    # 1. 只遍历所有键 obj.keys()
    for k in obj.keys():
    print(k, obj[k])

    # 2. 只遍历所有值 obj.values()
    # 注意:只能拿值,无法反向通过值查找对应键
    for v in obj.values():
    print(v)

    # 3. 同时遍历键+值 obj.items()(最常用)
    for k, v in obj.items():
    print(f"{k}:{v}")

    实战:字符统计字典(统计字符串每个字符出现次数)

    需求:遍历字符串,自动记录每个字符出现次数,无前置初始化字典:

    python

    运行

    # 空字典,动态新增字符键
    obj = {}
    for e in "hello world":
    if e in obj:
    # 键已存在,计数+1
    obj[e] += 1
    else:
    # 键不存在,新建键,初始值=1
    obj[e] = 1
    print(obj)
    # 输出:{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

    四、字典增删改查全套内置方法

    4.1 修改 / 新增键值

  • 下标直接赋值:存在则更新,不存在则新增
  • python

    运行

    obj["addr"] = "地点"

  • update()批量更新,支持一次性修改多个键
  • python

    运行

    obj.update({"addr": "杭州", "name": "小明"})
    # 注意:obj.update() 无返回值,变量接收会得到 None
    b = obj.update({"addr": "地点"})
    print(b) # None

  • setdefault():键不存在才新增,已存在则不修改
  • python

    运行

    # addr已有值,不会覆盖;无addr则新增默认值"杭"
    obj.setdefault("addr", "杭")

    4.2 删除元素

  • pop(键):删除指定键,返回被删除的值,键不存在直接报错
  • python

    运行

    r = obj.pop(2)
    print(r, obj)

  • popitem():删除最后插入的一组键值对(Python3.7 + 字典有序)
  • python

    运行

    r = obj.popitem()

  • clear():清空字典所有内容,保留空字典对象
  • python

    运行

    obj.clear()

    4.3 安全取值

    get(键, 默认值):键存在返回对应值,不存在返回None(或自定义默认值),不会抛KeyError,生产环境推荐替代obj["key"]:

    python

    运行

    print(obj.get("key1"))
    print(obj.get("test", 0)) # 无test键,返回0

    4.4 快速创建字典

    dict.fromkeys(键列表, 统一值):批量生成多键字典,所有键初始值相同

    python

    运行

    d0 = dict.fromkeys(["key1", "key2", "key3"], 222)
    print(d0) # {'key1': 222, 'key2': 222, 'key3': 222}

    4.5 类型转换创建字典

    dict()支持接收「嵌套二元序列」生成字典,每一组子序列必须只有 2 个元素(键、值):

    python

    运行

    # 列表嵌套列表
    d = dict([["key1", range(10)], ["key3", "按键3"]])
    # 元组嵌套元组
    d = dict(((1,2), (2,1)))

    五、JSON 序列化与文件持久化(字典落地本地文件)

    5.1 核心概念区分

    表格

    函数作用使用场景
    json.dumps() 序列化:Python 字典 / 列表 → JSON 字符串 纯内存处理字符串
    json.loads() 反序列化:JSON 字符串 → Python 字典 / 列表 纯内存解析字符串
    json.dump() 序列化写入文件:Python 数据直接存 txt 本地持久化(最常用)
    json.load() 读取文件反序列化:读取 txt 转为 Python 数据 读取本地存储数据

    5.2 写入 JSON 文件两种写法

    方式 1:dumps 先转字符串,再 write 写入

    python

    运行

    import json
    student = [{"student_id":1, "name":"张"}, {"student_id":2, "name":"赵"}]
    # 转为json字符串,ensure_ascii=False 保留中文不转义
    student_str = json.dumps(student, ensure_ascii=False)
    f = open("date.txt", "w", encoding="utf-8")
    f.write(student_str)
    f.close()

    方式 2:dump 直接写入(with 上下文管理器,自动关闭文件,推荐)

    python

    运行

    student = [{"student_id":1, "name":"张"}, {"student_id":2, "name":"赵"}]
    with open("date.txt", "w", encoding="utf-8") as f:
    json.dump(student, f, ensure_ascii=False)

    • ensure_ascii=False 关键参数:解决中文乱码,不加中文会变成\\uXXXX编码

    5.3 读取 JSON 文件两种写法

    方式 1:loads 读取文本后解析

    python

    运行

    f = open("date.txt", "r", encoding="utf-8")
    student_list = json.loads(f.read())
    print(student_list, type(student_list))
    f.close()

    方式 2:load 直接读取文件(推荐)

    python

    运行

    with open("date.txt", "r", encoding="utf-8") as f:
    student_list = json.load(f)
    print(student_list, type(student_list))

    六、JSON 文件高频报错避坑指南(你之前踩过的全部问题)

  • JSONDecodeError: Expecting value: line1 column1 原因:txt 文件空白、无任何 JSON 内容;解决方案:文件写入标准空容器{}(字典)/[](列表),代码增加try-except捕获异常,空文件自动赋值空字典。
  • TypeError: list indices must be integers or slices, not str 原因:文件存储[]列表,读取后赋值给本应是字典的变量,用字符串下标取值;解决方案:统一业务存储为{}字典,读取后判断数据类型,列表自动转为空字典。
  • JSONDecodeError: Extra data 原因:文件每行一条独立 JSON,不是一整块数组 / 字典;解决方案:文件外层包裹[]合并成单个数组,或逐行循环json.loads()解析。
  • 中文乱码 解决方案:json.dump/dumps必须添加ensure_ascii=False,打开文件统一指定encoding="utf-8"。
  • 赞(0)
    未经允许不得转载:171主机测评 » Python 字典与 JSON 文件读写全指南|从基础语法到持久化字符统计实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址