Python 进阶核心:字典 / 文件操作 + 上下文管理器实战指南


🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:


文章目录

  • 前言:
  • [一. Python 字典:键值对的高效映射](#一. Python 字典:键值对的高效映射)
    • [1.1 字典的核心特性](#1.1 字典的核心特性)
    • [1.2 字典的核心操作](#1.2 字典的核心操作)
  • [二. 文件操作:数据持久化的核心](#二. 文件操作:数据持久化的核心)
    • [2.1 文件路径 与 打开方式](#2.1 文件路径 与 打开方式)
      • [2.1.1 文件路径](#2.1.1 文件路径)
      • [2.1.2 打开方式(open() 函数核心参数)](#2.1.2 打开方式(open() 函数核心参数))
    • [2.2 文本文件的读写操作](#2.2 文本文件的读写操作)
    • [2.3 中文编码处理(避坑重点)](#2.3 中文编码处理(避坑重点))
  • [三. 上下文管理器:with语句简化文件操作](#三. 上下文管理器:with语句简化文件操作)
  • 结尾:

前言:

在 Python 开发中,字典(dict)和文件操作是两大高频核心技能:字典凭借键值对映射实现高效数据查询,是处理配置、缓存、映射关系的首选;文件操作则解决数据持久化问题,让内存中的数据能永久存储到硬盘。而上下文管理器(with 语句)更是简化文件操作、避免资源泄露的 "神器"。本文从字典的底层原理、核心操作,到文件的读写逻辑、编码处理,再到上下文管理器的妙用,层层递进帮你吃透这些实用技能,从 "会用" 升级到 "活用"。


一. Python 字典:键值对的高效映射

字典是 Python 中唯一的内置映射类型,本质是哈希表,通过键(key) 快速定位 值(value),查询时间复杂度接近 O(1),比列表遍历高效得多。

1.1 字典的核心特性

  • 键(key):必须唯一且哈希(不可变类型:整数,字符串,元组等;列表,字典等可变类型不能作为key);
  • 值(value):可以是任意类型(整数,字符串,列表,甚至字典)
  • Python 现在字典会保留键值对的插入顺序(3.7 版本之后)
  • 支持动态新增,修改,删除键值对,灵活性极高。

1.2 字典的核心操作

(1)创建字典

python 复制代码
# 1. 创建字典
# 方法1: 直接用 {} (推荐)
a = {}
print(type(a))
# 方法2: 用 dict() 函数
b = dict()
print(type(b))

# 2. 创建字典的同时设置初始值
# a = {'id' : 1, 'name' : 'Lotso'}

# 为了美观,会像下面这样书写,最后一个键值对带不带 , 都行
a = {
    'id' : 1,
    'name' : "Lotso"
}
print(a)


(2)增删查改

python 复制代码
# 1. 使用 in 来判定某个 key 是否在字典中存在.
a = {
    'id' : 1,
    'name' : "Lotso"
}

print('id' in a)
print('classId' in a)

# in 只是判定 key 是否存在,和 value 无关!
# print('Lotso' in a) # 这个会返回 false,因为这个是 value 值

# not in 来判定 key 在字典中是不是不存在
print('id' not in a)
print('classId' not in a)

# 2. 使用 [ ] 来根据 key 获取到 value
a = {
    'id' : 1,
    'name' : "Lotso",
    100 : 'lisi'
}

print(a['id'])
print(a['name'])
print(a[100])
# print(a['classId']) # 会直接报错
  • 增 && 改 && 删
python 复制代码
# 1. 在字典中新增元素,使用 [ ] 来进行.
a = {
    'id' : 1,
    'name' : "Lotso"
}

# 这个操作就是往字典里插入新的键值对
a['score'] = 90
print(a)

# 2. 在字典中,根据 key 修改 value,也是用 [ ] 来进行的
a['score'] = 79
print(a)

# 3. 使用 pop 方法,根据 key 来删除键值对
a.pop('name')
print(a)

(3)遍历字典

python 复制代码
# 直接使用 for 循环来遍历字典
a = {
    'name' : 'Lotso',
    'id' : 1,
    'score' : 90
}

# for key in a:
#     print(key, a[key])

# print(a.keys())
# print(a.values())
# print(a.items())

# 推荐直接像下面这样
for key, value in a.items():
    print(key, value)

(4)合法 key 的判定

合法 key 必须是 "可哈希" 类型(能通过 hash() 函数计算哈希值),常见合法/非法 key:

python 复制代码
# 使用 hash 函数能够计算出一个变量的哈希值。
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash((1,2,3)))

# 有的类型是不能计算哈希值的,不能作为 key
# print(hash([1,2,3]))
# Traceback (most recent call last):
#   File "D:\Gitee.code\python-fundamentals-\PythonProject\2025--12--02\code54.py", line 9, in <module>
#     print(hash([1,2,3]))
#           ~~~~^^^^^^^^^
# TypeError: unhashable type: 'list'

# print(hash({ }))
# Traceback (most recent call last):
#   File "D:\Gitee.code\python-fundamentals-\PythonProject\2025--12--02\code54.py", line 10, in <module>
#     print(hash({ }))
#           ~~~~^^^^^
# TypeError: unhashable type: 'dict'

二. 文件操作:数据持久化的核心

变量存储在内存中,程序重启后数据丢失;文件操作则将数据写入硬盘,实现持久化存储。Python 文件操作支持文本文件,二进制文件(图片,视频等),核心流程是:"打开 -> 操作 -> 关闭"

2.1 文件路径 与 打开方式

2.1.1 文件路径

  • 绝对路径 :从盘符/根目录开始(如:D:/test.txthome/user/test.txt)
  • 相对路径 :相对于当前程序所在目录(如:./test.txt./ 可省略)
  • 路径分隔符 :Windows用 \,Linux/Mac用 /,Python
python 复制代码
# 使用 open 打开一个文件
f = open('D:/Python环境/test.txt','r')
print(f)
print(type(f))

# 记得要关闭文件
f.close()
python 复制代码
# 打开文件个数的上限

flist = []
count = 0
while True:
    f = open('D:/Python环境/test.txt','r')
    flist.append(f)
    # f.close()
    count += 1
    print(f'打开文件的个数:{count}')
# 如果不关闭,文件打开有上限

2.1.2 打开方式(open() 函数核心参数)

打开方式 含义 注意事项
'r' 只读模式(默认) 文件不存在会抛 FileNotFoundError
'w' 只写模式 覆盖原有内容,文件不存在则创建
'a' 追加模式 在文件末尾写入,文件不存在则创建
'r+' 读写模式 不覆盖原有内容,光标默认在文件开头
'wb' / 'rb' 二进制写 / 读(用于图片、视频等非文本文件) 无需指定 encoding 参数

补充说明

  • 'w+':读写模式,会清空文件后写入,文件不存在则创建。
  • 'a+':追加读写模式,文件不存在则创建,光标默认在文件末尾。
  • 'x':独占创建模式,文件已存在则报错,用于防止覆盖。
python 复制代码
# 使用 write 来实现写文件的操作
f = open('D:/Python环境/test.txt','w')
f.write('hello world')
f.close()


# 写文件的时候,需要使用 w 的方式打开.如果是 r 方式打开,则会抛出异常.
# f = open('D:/Python环境/test.txt','r')
# f.write('hello world')
# f.close()
# Traceback (most recent call last):
#   File "D:\Gitee.code\python-fundamentals-\PythonProject\2025--12--07\code57.py", line 9, in <module>
#     f.write('hello world')
#     ~~~~~~~^^^^^^^^^^^^^^^
# io.UnsupportedOperation: not writable


# 写方式打开,其实又有两种情况,直接写方式打开,追加写方式打开
f = open('D:/Python环境/test.txt','w')
f.write('1111\n')
f.close()

f = open('D:/Python环境/test.txt','a')
f.write('2222')
f.close()


# 如果文件对象已经关闭,那么意味着系统中和该文件相关的内存资源已经释放了.强行去写,就会出异常
# f = open('D:/Python环境/test.txt','w')
# f.close()
# f.write('hello')
# Traceback (most recent call last):
#   File "D:\Gitee.code\python-fundamentals-\PythonProject\2025--12--07\code57.py", line 31, in <module>
#     f.write('hello')
#     ~~~~~~~^^^^^^^^^
# ValueError: I/O operation on closed file.

2.2 文本文件的读写操作

(1)基本读写(手动关闭文件)

python 复制代码
# 1. 写文件('w'模式,覆盖原有内容)
f = open("test.txt", "w", encoding="utf-8")  # encoding指定字符编码(关键!)
f.write("床前明月光\n疑是地上霜\n")  # 写入字符串,\n换行
f.write("举头望明月\n低头思故乡")
f.close()  # 必须关闭文件,否则数据可能丢失(缓冲区未刷新)

# 2. 读文件('r'模式)
f = open("test.txt", "r", encoding="utf-8")
# 方式1:读指定长度字符
print(f.read(5))  # 输出:床前明月光

# 方式2:逐行读取(推荐,适合大文件)
f.seek(0)  # 光标回到文件开头
for line in f:
    print(line.strip())  # strip()去除换行符和空格

# 方式3:读取所有行(返回列表)
f.seek(0)
lines = f.readlines()
print(lines)  # 输出:['床前明月光\n', '疑是地上霜\n', '举头望明月\n', '低头思故乡']
f.close()  # 手动关闭,避免资源泄露
python 复制代码
# 1. 使用 read 来读取文件内容.指定读几个字符.
# f = open('D:/Python环境/test.txt','r',encoding='utf-8')
# result = f.read(2)
# print(result)
# f.close()

# 2. 更常见的需求,是按行来读取~~
#    最常见的办法,直接 for 循环
# f = open('D:/Python环境/test.txt','r',encoding='utf-8')
# for line in f:
#     print(f'line:{line}',end='')
# f.close()

# 3. 还可以使用 readlines 方法直接把整个文件所有内容读取出来,按照行组织到一个列表里.
f = open('D:/Python环境/test.txt','r',encoding='utf-8')
lines = f.readlines()
print(lines)
f.close()

(2)追加写 'a'

python 复制代码
f = open("test.txt", "a", encoding="utf-8")
f.write("\n------李白《静夜思》")
f.close()

2.3 中文编码处理(避坑重点)

读写中文时最容易出现乱码或UnicodeDecodeError,核心是编码一致:

  • 保存文件时指定编码(如utf-8);
  • 读取文件时使用相同编码;
  • Windows 默认编码是gbk,Linux/Mac 默认是utf-8,建议统一用utf-8
python 复制代码
# 正确读写中文(指定encoding="utf-8")
f = open("中文测试.txt", "w", encoding="utf-8")
f.write("你好,Python!")
f.close()

f = open("中文测试.txt", "r", encoding="utf-8")
print(f.read())  # 正常输出:你好,Python!
f.close()

三. 上下文管理器:with语句简化文件操作

打开文件之后,是容易忘记关闭的。Python提供了上下文管理器(可以类比C++中的智能指针来理解),来帮助程序员自动关闭文件

  • 使用 with 语句打开文件。
  • 当 with 内部的代码块执行完毕后,就会自动调用关闭方式。
python 复制代码
with open('D:/Python环境/test.txt', 'r', encoding='utf8') as f:
	lines = f.readlines()
	print(line
python 复制代码
# 上下文管理器 -- 作用类似 C++ 中的智能指针
# 有些时候非常容易遗漏 close

# 使用上下文管理器,解决这个问题
# def func():
#     with open('D:/Python环境/test.txt','r',encoding='utf-8') as f:
#         # 进行文件这里的处理逻辑
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         if cond:
#             return
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         # 假设这里有很多的代码
#         if cond:
#             return

结尾:

html 复制代码
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:字典和文件操作是 Python 开发的 "基本功",而上下文管理器则是 "进阶优化" 的关键。掌握字典的高效映射,能让数据处理更快捷;精通文件操作,能解决数据持久化需求;善用with语句,能让代码更简洁、更安全。这些技能在实际开发中无处不在 ------ 从配置管理、数据缓存,到日志记录、文件解析,都是高频应用场景。多加练习,就能灵活运用到项目中。

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど

相关推荐
天远Date Lab2 小时前
Python实现用户消费潜力评估:天远个人消费能力等级API对接全攻略
java·大数据·网络·python
乐迪信息4 小时前
乐迪信息:目标检测算法+AI摄像机:煤矿全场景识别方案
人工智能·物联网·算法·目标检测·目标跟踪·语音识别
学术小白人6 小时前
【EI会议征稿通知】2026年智能感知与自主控制国际学术会议(IPAC 2026)
人工智能·物联网·数据分析·区块链·能源
HyperAI超神经6 小时前
在线教程丨 David Baker 团队开源 RFdiffusion3,实现全原子蛋白质设计的生成式突破
人工智能·深度学习·学习·机器学习·ai·cpu·gpu
ASKED_20199 小时前
End-To-End之于推荐: Meta GRs & HSTU 生成式推荐革命之作
人工智能
liulanba9 小时前
AI Agent技术完整指南 第一部分:基础理论
数据库·人工智能·oracle
自动化代码美学9 小时前
【AI白皮书】AI应用运行时
人工智能
小CC吃豆子9 小时前
openGauss :核心定位 + 核心优势 + 适用场景
人工智能
secondyoung9 小时前
TLE9180短路检测功能总结
经验分享·嵌入式硬件·mcu·汽车·流程图·infineon·tle9180