【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
✨个人主页: 熬夜学编程的小林
💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】【MySQL】【Python】
目录
1、字典
1.1、字典是什么
1.2、创建字典
1.3、查找 key
1.4、新增/修改元素
1.5、删除元素
1.6、遍历字典元素
1.7、取出所有 key 和 value
1.8、合法的 key 类型
1.9、小结
2、文件
2.1、文件是什么
2.2、文件路径
2.3、文件操作
2.3.1、打开文件
2.3.2、关闭文件
2.3.3、写文件
2.3.4、读文件
2.4、关于中文的处理
2.5、使用上下文管理器
1、字典
1.1、字典是什么
字典是一种存储 键值对 的结构.
啥是键值对? 这是计算机/生活中一个非常广泛使用的概念.
把 键(key) 和 值(value) 进行一个一对一的映射, 然后就可以根据键, 快速找到值.
- 举个栗子, 学校的每个同学, 都会有一个唯一的学号.
- 知道了学号, 就能确定这个同学.
- 此处 "学号" 就是 "键", 这个 "同学" 就是 "值".
1.2、创建字典
创建一个空的字典. 1、使用 { } 表示字典. 2、使用dict()函数创建字典,适用动态创建情况。
a = {} # 创建一个空字典
b = dict() # 使用函数创建字典
print(type(a))
print(type(b))
- 也可以在创建的同时指定初始值
- 键值对之间使用 , 分割, 键和值之间使用 : 分割. (冒号后面推荐加一个空格).
- 使用 print 来打印字典内容
student = {'id': 1,'name': 'zhangsan'} # 创建字典并初始化
print(student) # 打印字典数据
- 为了代码更规范美观, 在创建字典的时候往往会把多个键值对, 分成多行来书写.
student = {'id': 1,'name': 'zhangsan'
} # 创建字典并分行初始化
print(student) # 打印字典数据
- 最后一个键值对, 后面可以写 , 也可以不写.
student = {'id': 1,'name': 'zhangsan', # 最后一个键值对加,
} # 创建字典并分行初始化
print(student) # 打印字典数据
1.3、查找 key
使用 in 可以判定 key 是否在 字典 中存在. 返回布尔值.
student = {'id': 1,'name': 'zhangsan',
}
print('id' in student) # 判断key值id是否存在
print('score' in student) # 判断key值score是否存在
使用 [ ] 通过类似于取下标的方式, 获取到元素的值. 只不过此处的 "下标" 是 key. (可能是整数, 也可能是字符串等其他类型).
student = {'id': 1,'name': 'zhangsan',
}
print(student['id']) # key值id对应的值
print(student['name']) # key值name对应的值
如果 key 在字典中不存在, 则会抛出异常.
student = {'id': 1,'name': 'zhangsan',
}
print(student['score']) # key值score对应的值,不存在则抛异常
1.4、新增/修改元素
使用 [ ] 可以根据 key 来新增/修改 value.
如果 key 不存在, 对取下标操作赋值, 即为新增键值对
student = {'id': 1,'name': 'zhangsan'
}print(student)
student['score'] = 90 #key值score不存在则新增键值对
print(student)
如果 key 已经存在, 对取下标操作赋值, 即为修改键值对的值.
student = {'id': 1,'name': 'zhangsan','score': 80
}print(student)
student['score'] = 90 # key值已经存在,即对键值对值进行修改
print(student)
1.5、删除元素
使用 pop 方法根据 key 删除对应的键值对.
student = {'id': 1,'name': 'zhangsan','score': 80
}print(student)
student.pop('score') # 删除key值为score的键值对
print(student)
1.6、遍历字典元素
直接使用 for 循环能够获取到字典中的所有的 key, 进一步的就可以取出每个值了.
student = {'id': 1,'name': 'zhangsan','score': 80
}for key in student:print(key,student[key])
1.7、取出所有 key 和 value
使用 keys 方法可以获取到字典中的所有的 key
student = {'id': 1,'name': 'zhangsan','score': 80
}print(student.keys()) # 使用keys获取所有key值
- 此处 dict_keys 是一个特殊的类型, 专门用来表示字典的所有 key. 大部分元组支持的操作对于dict_keys 同样适用.
使用 values 方法可以获取到字典中的所有 value
student = {'id': 1,'name': 'zhangsan','score': 80
}print(student.values()) # 使用values获取所有value值
- 此处 dict_values 也是一个特殊的类型, 和 dict_keys 类似.
使用 items 方法可以获取到字典中所有的键值对.
student = {'id': 1,'name': 'zhangsan','score': 80
}print(student.items()) # 使用items获取所有键值对
1.8、合法的 key 类型
不是所有的类型都可以作为字典的 key.
字典本质上是一个 哈希表, 哈希表的 key 要求是 "可哈希的", 也就是可以计算出一个哈希值.
- 可以使用 hash 函数计算某个对象的哈希值.
- 但凡能够计算出哈希值的类型, 都可以作为字典的 key.
print(hash(0)) # 计算hash值
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash(()))
列表无法计算哈希值.
print(hash([1,2,3])) # 列表不能计算hash值
字典也无法计算哈希值
print(hash({'id': 1})) # 字典不能计算hash值
1.9、小结
字典也是一个常用的结构. 字典的所有操作都是围绕 key 来展开的.
需要表示 "键值对映射" 这种场景时就可以考虑使用字典.
2、文件
2.1、文件是什么
变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失.
要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在 文件 中保存.
在 Windows "此电脑" 中, 看到的内容都是 文件.
通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下:
- 文本文件 (txt)
- 可执行文件 (exe, dll)
- 图片文件 (jpg, gif)
- 视频文件 (mp4, mov)
- office 文件 (.ppt, docx)
- ......
我们主要研究最简单的文本文件.
2.2、文件路径
一个机器上, 会存在很多文件, 为了让这些文件更方面的被组织, 往往会使用很多的 "文件夹"(也叫做目录)来整理文件.
实际一个文件往往是放在一系列的目录结构之中的.
为了方便确定一个文件所在的位置, 使用 文件路径 来进行描述.
例如, 上述截图中的 QQ.exe 这个文件, 描述这个文件的位置, 就可以使用路径D:\program\qq\Bin\QQ.exe 来表示.
- D: 表示 盘符. 不区分大小写.
- 每一个 \ 表示一级目录. 当前 QQ.exe 就是放在 "D 盘下的 program 目录下的 qq 目录下的 Bin 目录中" .
- 目录之间的分隔符, 可以使用 \ 也可以使用 / . 一般在编写代码的时候使用 / 更方便.
上述以 盘符 开头的路径, 我们也称为 绝对路径.
除了绝对路径之外, 还有一种常见的表示方式是 相对路径. 相对路径需要先指定一个基准目录, 然后
以基准目录为参照点, 间接的找到目标文件. 咱们课堂上暂时不详细介绍.
描述一个文件的位置, 使用 绝对路径 和 相对路径 都是可以的. 对于新手来说, 使用 绝对路径 更简
单更好理解, 也不容易出错.
2.3、文件操作
要使用文件, 主要是通过文件来保存数据, 并且在后续把保存的数据读取出来.
但是要想读写文件, 需要先 "打开文件", 读写完毕之后还要 "关闭文件".
2.3.1、打开文件
使用内建函数 open 打开一个文件.
f = open('d:/test.txt', 'r') # 以读的方式打开文件
- 第一个参数是一个字符串, 表示要打开的文件路径
- 第二个参数是一个字符串, 表示打开方式. 其中 r 表示按照读方式打开. w 表示按照写方式打开. a表示追加写方式打开.
- 如果打开文件成功, 返回一个文件对象. 后续的读写文件操作都是围绕这个文件对象展开.
- 如果打开文件失败(比如路径指定的文件不存在), 就会抛出异常.
2.3.2、关闭文件
使用 close 方法关闭已经打开的文件.
f.close() # 关闭文件
- 使用完毕的文件要记得及时关闭!
一个程序能同时打开的文件个数, 是存在上限的.
flist = []
count = 0
while True:f = open('d:/test.txt', 'r') # 需要现在d盘路径下创建一个test.txt文件flist.append(f) # 尾插文件对象count += 1print(f'count = {count}')
- 如上面代码所示, 如果一直循环的打开文件, 而不去关闭的话, 就会出现上述报错.
- 当一个程序打开的文件个数超过上限, 就会抛出异常.
注意: 上述代码中, 使用一个列表来保存了所有的文件对象. 如果不进行保存, 那么 Python 内置的垃
圾回收机制, 会在文件对象销毁的时候自动关闭文件.
但是由于垃圾回收操作不一定及时, 所以我们写代码仍然要考虑手动关闭, 尽量避免依赖自动关闭.
2.3.3、写文件
文件打开之后, 就可以写文件了.
- 写文件, 要使用写方式打开, open 第二个参数设为 'w'
- 使用 write 方法写入文件.
f = open('d:/test.txt', 'w') # 以写的方式打开文件
f.write('hello') # 向文件中写入hello字符串
f.close() # 关闭文件
- 用记事本打开文件, 即可看到文件修改后的内容.
如果是使用 'r' 方式打开文件, 则写入时会抛出异常.
f = open('d:/test.txt', 'r') # 以读的方式打开文件
f.write('hello') # 向文件中写入hello字符串
f.close() # 关闭文件
使用 'w' 一旦打开文件成功, 就会清空文件原有的数据.
使用 'a' 实现 "追加写", 此时原有内容不变, 写入的内容会存在于之前文件内容的末尾.
f = open('d:/test.txt', 'w') # 以写的方式打开文件
f.write('hello') # 向文件中写入hello字符串
f.close() # 关闭文件f = open('d:/test.txt', 'a') # 以追加的方式打开文件
f.write(' world') # 向文件中追加写入 world
f.close() # 关闭文件
针对已经关闭的文件对象进行写操作, 也会抛出异常.
f = open('d:/test.txt', 'w')
f.write('hello') # 向文件写入hello字符串
f.close() # 关闭文件
f.write('world') # 文件关闭之后写入文件内容抛异常
2.3.4、读文件
读文件内容需要使用 'r' 的方式打开文件
使用 read 方法完成读操作. 参数表示 "读取几个字符"
- 注意:读文件之前需要先有该文件
f = open('d:/test.txt', 'r') # 以读的方式打开文件
result = f.read(2) # 读取两个字符
print(result)
f.close() # 关闭文件
- 如果文件是多行文本, 可以使用 for 循环一次读取一行.
先构造一个多行文件.
f = open('d:/test.txt', 'r')
for line in f:print(f'line = {line}') # 以行读取文件
f.close()
注意: 由于文件里每一行末尾都自带换行符, print 打印一行的时候又会默认加上一个换行符, 因此
打印结果看起来之间存在空行.
使用 print(f'line = {line}', end='') 手动把 print 自带的换行符去掉.
f = open('d:/test.txt', 'r')
for line in f:print(f'line = {line}', end='') # 以行读取文件,并手动去掉换行
f.close()
使用 readlines 直接把文件整个内容读取出来, 返回一个列表. 每个元素即为一行.
f = open('d:/test.txt', 'r')
lines = f.readlines() # 读取整个文件内容
print(lines)
f.close()
- 此处的 \n 即为换行符.
2.4、关于中文的处理
当文件内容存在中文的时候, 读取文件内容不一定就顺利.
同样上述代码, 有的uu执行时可能会出现异常
也有的uu可能出现乱码.
计算机表示中文的时候, 会采取一定的编码方式, 我们称为 "字符集"
- 所谓 "编码方式" , 本质上就是使用数字表示汉字.
- 我们知道, 计算机只能表示二进制数据. 要想表示英文字母, 或者汉字, 或者其他文字符号, 就都要通过编码.
- 最简单的字符编码就是 ascii. 使用一个简单的整数就可以表示英文字母和阿拉伯数字.
- 但是要想表示汉字, 就需要一个更大的码表.
- 一般常用的汉字编码方式, 主要是 GBK 和 UTF-8
必须要保证文件本身的编码方式, 和 Python 代码中读取文件使用的编码方式匹配, 才能避免出现上述问题.
- Python3 中默认打开文件的字符集跟随系统, 而 Windows 简体中文版的字符集采用了 GBK, 所以如果文件本身是 GBK 的编码, 直接就能正确处理.
- 如果文件本身是其他编码(比如 UTF-8), 那么直接打开就可能出现上述问题
使用记事本打开文本文件, 在 "菜单栏" -> "文件" -> "另存为" 窗口中, 可以看到当前文件的编码方式.
- 如果此处的编码为 ANSI , 则表示 GBK 编码.
- 如果此处为 UTF-8 , 则表示 UTF-8 编码.
此时修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的字符集, 问题即可解决.
f = open('d:/test.txt', 'r', encoding='utf8')
- PS: 字符编码问题, 是编程中一类比较常见, 又比较棘手的问题. 需要对于字符编码有一定的理解, 才能从容应对.
- uu们可以参考腾讯官方账号发表的帖子, 详细介绍了里面的细节.程序员必备:彻底弄懂常见的7种中文字符编码
2.5、使用上下文管理器
打开文件之后, 是容易忘记关闭的. Python 提供了 上下文管理器 , 来帮助程序猿自动关闭文件.
- 使用 with 语句打开文件.
- 当 with 内部的代码块执行完毕后, 就会自动调用关闭方法.
with open('d:/test.txt', 'r', encoding='utf8') as f:lines = f.readlines()print(lines)
相关文章:

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…...
Nginx 运维开发高频面试题详解
一、基础核心问题 原文链接:https://blog.csdn.net/weixin_51146329/article/details/142963853 1、什么是Nginx? Nginx 是一个高性能的 HTTP 和反向代理服务器,它以轻量级和高并发处理能力而闻名。Nginx 的反向代理功能允许它作为前端服务…...

下载OpenJDK
由于Oracle需要付费,并且之前我在寻找openJDK的时候,我不知道网址,并且也不知道在这个openjdk这个网址里点击哪个模块进行下载。最近我在看虚拟机相关的书籍的时候,找到了相关的网址。 注意:下面的下载都是基于可以科…...
Web3.js详解
Web1&Web2&Web3 以下是Web1、Web2和Web3的详细介绍,以及一个对比表格: Web1 定义:Web1指的是有着固定内容的非许可的开源网络。特点:在Web1时代,网站内容主要由网站管理员或创建者提供,用户只能…...

学习串行通信
本文来源: [8-1] 串口通信_哔哩哔哩_bilibili 智谱清言 ------------ 串口(Serial Port): 串口是一种应用非常广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设…...

【leetcode强化练习·二叉树】同时运用两种思维解题
本文参考labuladong算法笔记[【强化练习】同时运用两种思维解题 | labuladong 的算法笔记] 有的题目可以同时用「遍历」和「分解问题」两种思路来解,你可以利用这些题目训练自己的思维。 559. N 叉树的最大深度 | 力扣 | LeetCode | 给定一个 N 叉树,…...

Rank-analysis-1.2——一款基于LCU API的排位分析工具,大四学生独立开发
LOL Rank Record Analysis:一款基于LCU API的排位分析工具,大四学生独立开发! 大家好!我是河南科技学院的大四学生,今天给大家分享一个我自己开发的软件——LOL Rank Record Analysis。这是一个基于 Riot 提供的 LCU …...

什么是门控循环单元?
一、概念 门控循环单元(Gated Recurrent Unit,GRU)是一种改进的循环神经网络(RNN),由Cho等人在2014年提出。GRU是LSTM的简化版本,通过减少门的数量和简化结构,保留了LSTM的长时间依赖…...

Google Chrome-便携增强版[解压即用]
Google Chrome-便携增强版 链接:https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装,即可以覆盖更新又能解压使用! √ 此增强版,支持右键解压使用 √ 加入Chrome增强…...

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制
内容概要 在当前快速发展的城市环境中,智慧园区综合管理系统正在成为各类园区管理的重要工具,无论是工业园、产业园、物流园,还是写字楼与公寓,都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统,用…...

【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙
目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
目录 协议层设计,以IIC为例子 关于软硬件IIC 设计的一些原则 完成协议层的抽象 刨析我们的原理 如何完成我们的抽象 插入几个C语言小技巧 完成软件IIC通信 开始我们的IIC通信 结束我们的IIC通信 发送一个字节 (重要)完成命令传递和…...

Mac M1 源码安装FFmpeg,开启enable-gpl 和 lib x264
1、第一步:下载并安装minicoda curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.shsh Miniconda3-latest-MacOSX-arm64.sh2、第二步:安装必要的依赖 conda install -c conda-forge gcc make nasm yasm3、第三步ÿ…...

【Quest开发】手柄单手抓握和双手抓握物体切换
V72更新以后非常智能哈,配置物体简单多了。 选择需要被抓取的物体鼠标右键单击它,点Add Grab Interaction,按它要求的配置就行 配好以后长这样 把这个选项取消勾选就能切换成双手抓一个物体了,不需要像以前一样用各种grabTransfo…...

DB-GPT试用
继续上一篇 DB-GPT的安装 https://blog.csdn.net/berryreload/article/details/142845190 访问http://xxx:5670 访问这里 创建数据库连接 http://10.168.1.208:5670/construct/database 访问这里,点击刷新 http://10.168.1.208:5670/construct/app 刷新后才能出…...
《Ollama Python 库》
Ollama Python 库 Ollama Python 库提供了将 Python 3.8 项目与 Ollama 集成的最简单方法。 先决条件 应该安装并运行 Ollama拉取一个模型以与库一起使用:例如ollama pull <model>ollama pull llama3.2 有关可用模型的更多信息,请参阅 Ollama.com。…...
Java的Integer缓存池
Java的Integer缓冲池? Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…...
Ubuntu16.04编译安装Cartographer 1.0版本
说明 官方文档 由于Ubuntu16.04已经是很老的系统,如果直接按照Cartographer官方安装文档安装会出现代码编译失败的问题,本文给出了解决这些问题的办法。正常情况下执行本文给出的安装方法即可成功安装。 依赖安装 # 这里和官方一致 # Install the req…...
Qt调用FFmpeg库实时播放UDP组播视频流
基于以下参考链接,通过改进实现实时播放UDP组播视频流 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows(qt-opensource-windows-x86-5.12.9.exe)、ubuntu20.04.6(x64)(qt-opensource-linux-x64-5.12.12.run)、以…...
C# 类与对象详解
.NET学习资料 .NET学习资料 .NET学习资料 在 C# 编程中,类与对象是面向对象编程的核心概念。它们让开发者能够将数据和操作数据的方法封装在一起,从而构建出模块化、可维护且易于扩展的程序。下面将详细介绍 C# 中类与对象的相关知识。 一、类的定义 …...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...