前面学到的列表和元组,本质上都是按照位置来找数据。
比如:
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'instudent例如:
student={'id':1,'name':'zhangsan'}print('id'instudent)print('score'instudent)结果分别是:
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键值对都会被删除。
七、遍历字典
最简单的遍历方式:
forkeyinstudent:print(key,student[key])这样拿到的是每个 key,然后再通过:
student[key]找到 value。
例如:
student={'id':1,'name':'zhangsan','score':80}forkeyinstudent: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')forlineinf: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例如:
withopen('d:/test.txt','r',encoding='utf8')asf: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 ↓ 文件后面写程序的时候,不再只是进行简单的计算,而是可以把数据组织起来、封装逻辑,并把数据真正保存到文件中。