云计算百科
云计算领域专业知识百科平台

Python基础语法学习:字典与文件操作

前面学到的列表和元组,本质上都是按照位置来找数据。

比如:

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
↓
文件

后面写程序的时候,不再只是进行简单的计算,而是可以把数据组织起来、封装逻辑,并把数据真正保存到文件中。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Python基础语法学习:字典与文件操作
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!