前面学到的列表和元组,本质上都是按照位置来找数据。
比如:
alist = ['zhangsan', 20, 90]
想拿到 90,需要知道它在下标 2 的位置。
但是很多实际场景不是这样。
例如:
学号 → 学生
姓名 → 成绩
账号 → 信息
我们真正关心的是“某个 key 对应什么 value”。
这种场景就特别适合使用字典。
而除了数据结构之外,程序运行时的数据默认保存在内存中。程序结束或者机器重启以后,内存中的数据就没了。
如果想把数据长期保存下来,就需要用到文件。
所以这一部分主要学习:
字典
文件
文件路径
文件读写
字符编码
with
一、字典是什么
Python 中的字典是一种保存键值对的数据结构。
所谓键值对,就是:
key → value
通过 key,可以快速找到对应的 value。
例如:
student = {
'id': 1,
'name': 'zhangsan'
}
这里:
id → 1
name → zhangsan
就是两个键值对。
二、创建字典
创建空字典:
student = {}
或者:
student = dict()
也可以直接初始化:
student = {
'id': 1,
'name': 'zhangsan'
}
字典中:
key : value
中间使用冒号分隔,不同键值对之间使用逗号分隔。
实际写代码的时候,如果键值对比较多,可以分成多行:
student = {
'id': 1,
'name': 'zhangsan',
'score': 90,
}
这样可读性更好。
三、查找key
判断一个 key 是否存在,可以使用:
'id' in student
例如:
student = {
'id': 1,
'name': 'zhangsan'
}
print('id' in student)
print('score' in student)
结果分别是:
True
False
四、通过key获取value
字典可以使用 [] 根据 key 获取对应的 value。
例如:
student = {
'id': 1,
'name': 'zhangsan'
}
print(student['id'])
print(student['name'])
输出:
1
zhangsan
这里的 [] 看起来和列表的下标访问很像,但本质不同。
列表里面:
alist[2]
这里的 2 是位置。
字典里面:
student['id']
这里的 'id' 是 key。
如果 key 不存在,会抛出异常。
五、给字典新增和修改元素
字典新增和修改元素都可以通过 [] 完成。
如果 key 原来不存在:
student['score'] = 90
就是新增。
如果 key 已经存在:
student['score'] = 100
就是修改原来的 value。
所以:
key 不存在 → 新增
key 已存在 → 修改
六、删除字典元素
可以使用 pop() 按照 key 删除:
student.pop('score')
这样整个:
'score' : 90
键值对都会被删除。
七、遍历字典
最简单的遍历方式:
for key in student:
print(key, student[key])
这样拿到的是每个 key,然后再通过:
student[key]
找到 value。
例如:
student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
for key in student:
print(key, student[key])
八、keys()、values()、items()
如果只想获取所有 key,可以使用:
student.keys()
得到一个 dict_keys 类型的对象。
如果只想获取所有 value:
student.values()
如果想同时获取 key 和 value:
student.items()
所以简单记:
keys() → 所有 key
values() → 所有 value
items() → 所有 key-value
九、什么类型可以当字典的key?
这个地方还是比较有意思的:
不是所有 Python 对象都能作为字典的 key。
字典本质上是哈希表,所以 key 必须是可哈希的。可以使用:
hash()
计算一个对象的哈希值。
例如:
hash(0)
hash(3.14)
hash('hello')
hash(True)
hash(())
这些类型都可以计算哈希值。
而列表不能:
hash([1, 2, 3])
因为列表是可修改的,不能作为字典的 key。字典本身也不能作为自己的 key。
这也正好对应前面学到的元组:
元组 → 不可变 → 可以作为 key
列表 → 可变 → 不能作为 key
十、字典什么时候最适合用?
只要数据关系比较明显地表现为:
key → value
就可以考虑字典。
比如:
student = {
'name': 'zhangsan',
'score': 90
}
通过:
student['name']
直接找到对应的数据。
这和列表按照位置找元素的思路完全不同。
十一、文件是什么
程序中的变量一般保存在内存里。
但是内存有一个明显的问题:
程序结束或者主机重启之后,数据就会丢失。
如果希望数据长期保存,就需要放到硬盘等持久化存储中,也就是保存成文件。
我们平时电脑里的:
txt
exe
dll
jpg
gif
mp4
ppt
docx
这些都属于文件。
这里主要先学习最简单的:
文本文件。
十二、文件路径
电脑里的文件非常多,所以通常会使用目录来组织这些文件。
例如:
D:\\program\\qq\\Bin\\QQ.exe
这就是一个文件路径。
这里:
D:
表示盘符。
后面的:
program
qq
Bin
表示一级一级的目录。
Windows 下路径分隔符通常写:
\\
也可以使用:
/
在代码中使用 / 往往更加方便。
十三、绝对路径和相对路径
例如:
D:\\program\\qq\\Bin\\QQ.exe
从盘符开始完整描述文件位置,这属于绝对路径。
相对路径则需要先确定一个基准目录,再从这个目录出发寻找目标文件。
刚开始接触文件操作的时候,绝对路径比较容易理解,但实际开发中相对路径也非常常见。
十四、打开文件
Python 使用:
open()
打开文件。
最基本的写法:
f = open('d:/test.txt', 'r')
这里第一个参数是文件路径。
第二个参数是打开模式。
常见的三个:
r → 读
w → 写
a → 追加写
如果打开成功,open() 会返回一个文件对象,后面的读写操作都围绕这个对象展开。
十五、关闭文件
打开之后,用完一定要关闭:
f.close()
例如:
f = open('d:/test.txt', 'r')
f.close()
程序能够同时打开的文件数量是有限制的。
如果一直打开文件却不关闭,最终可能达到文件数量上限并抛出异常。
虽然 Python 的垃圾回收机制可能会在文件对象销毁的时候自动关闭文件,但垃圾回收时间并不一定,所以平时写代码时不要依赖这个机制,还是应该养成主动关闭文件的习惯。
十六、写文件
写文件需要使用:
w
方式打开。
例如:
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
这样就可以把 hello 写入文件。
注意:
w 模式打开成功后,会清空原来的文件内容。
所以:
open('test.txt', 'w')
一定要小心。
十七、追加写入
如果不想删除原来的内容,而是希望把新内容追加到文件末尾,可以使用:
f = open('d:/test.txt', 'a')
f.write('world')
f.close()
原来的内容不会被清空,新内容会放到后面。
所以:
w → 覆盖写
a → 追加写
r → 读
这三个模式一定要分清。
十八、读文件
读取文件要使用:
r
模式。
比如:
f = open('d:/test.txt', 'r')
result = f.read(2)
print(result)
f.close()
read() 可以读取指定数量的字符。
如果文件包含多行文本,也可以直接遍历文件对象:
f = open('d:/test.txt', 'r')
for line in f:
print(line, end='')
f.close()
这样就可以一行一行读取。
十九、为什么读取文件后会多空行?
这个问题刚开始读文本文件时很容易遇到。
因为文件中的每一行结尾通常已经存在:
\\n
而 print() 默认自己还会再添加一个换行。
所以:
print(line)
看起来可能会多出空行。
可以写成:
print(line, end='')
取消 print() 自带的换行。
二十、readlines()
如果想一次性把文件内容全部读出来,可以使用:
f.readlines()
返回的是一个列表。
列表中的每一个元素对应文件中的一行。
例如:
f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()
二十一、中文乱码和字符编码
如果文件里面有中文,读取文件的时候可能出现:
异常
乱码
这时候就涉及字符编码。
计算机本身只能保存二进制数据,所以文字需要通过编码方式转换成数字。
常见的中文编码方式有:
GBK
UTF-8
一个非常重要的原则就是:
文件本身的编码方式,要和 Python 读取时使用的编码方式匹配。
如果文件是 UTF-8,可以显式写:
f = open('d:/test.txt', 'r', encoding='utf8')
这样就可以明确指定编码。
二十二、为什么会出现乱码?
假设文件实际使用的是:
UTF-8
但是程序却按照:
GBK
去解释里面的数据。
那么同一串二进制数据被不同的编码方式解释以后,就可能出现乱码甚至直接抛出异常。
所以以后碰到:
文件有中文
读取出错
打开显示乱码
第一时间就应该想到:
编码方式是不是不匹配。
二十三、with上下文管理器
每次:
open()
然后再:
close()
虽然没问题,但是很容易忘记关闭文件。
Python 提供了更加方便的方式:
with
例如:
with open('d:/test.txt', 'r', encoding='utf8') as f:
lines = f.readlines()
print(lines)
当 with 代码块执行结束之后,文件会自动关闭。
所以以后处理文件时,这种写法会更加省心。
二十四、总结
这一部分主要掌握了两大块内容。
第一块是字典:
key
value
keys()
values()
items()
in
pop()
最核心的思想是:
通过 key 找 value
第二块是文件:
open()
read()
write()
readlines()
close()
with
常用打开方式:
r → 读
w → 覆盖写
a → 追加写
还有一个很容易遇到的问题:
中文乱码
这时候需要考虑文件编码和读取时指定的编码是否一致。
现在把前面几部分连起来看,Python 的基础语法已经开始形成一个比较完整的体系:
变量
↓
if / for / while
↓
函数
↓
list / tuple
↓
dict
↓
文件
后面写程序的时候,不再只是进行简单的计算,而是可以把数据组织起来、封装逻辑,并把数据真正保存到文件中。
网硕互联帮助中心




评论前必须登录!
注册