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{}或者studentdict()也可以直接初始化student{id:1,name:zhangsan}字典中key : value中间使用冒号分隔不同键值对之间使用逗号分隔。实际写代码的时候如果键值对比较多可以分成多行student{id:1,name:zhangsan,score:90,}这样可读性更好。三、查找key判断一个 key 是否存在可以使用idinstudent例如student{id:1,name:zhangsan}print(idinstudent)print(scoreinstudent)结果分别是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类型的对象。如果只想获取所有 valuestudent.values()如果想同时获取 key 和 valuestudent.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()打开文件。最基本的写法fopen(d:/test.txt,r)这里第一个参数是文件路径。第二个参数是打开模式。常见的三个r → 读 w → 写 a → 追加写如果打开成功open()会返回一个文件对象后面的读写操作都围绕这个对象展开。十五、关闭文件打开之后用完一定要关闭f.close()例如fopen(d:/test.txt,r)f.close()程序能够同时打开的文件数量是有限制的。如果一直打开文件却不关闭最终可能达到文件数量上限并抛出异常。虽然 Python 的垃圾回收机制可能会在文件对象销毁的时候自动关闭文件但垃圾回收时间并不一定所以平时写代码时不要依赖这个机制还是应该养成主动关闭文件的习惯。十六、写文件写文件需要使用w方式打开。例如fopen(d:/test.txt,w)f.write(hello)f.close()这样就可以把hello写入文件。注意w模式打开成功后会清空原来的文件内容。所以open(test.txt,w)一定要小心。十七、追加写入如果不想删除原来的内容而是希望把新内容追加到文件末尾可以使用fopen(d:/test.txt,a)f.write(world)f.close()原来的内容不会被清空新内容会放到后面。所以w → 覆盖写 a → 追加写 r → 读这三个模式一定要分清。十八、读文件读取文件要使用r模式。比如fopen(d:/test.txt,r)resultf.read(2)print(result)f.close()read()可以读取指定数量的字符。如果文件包含多行文本也可以直接遍历文件对象fopen(d:/test.txt,r)forlineinf:print(line,end)f.close()这样就可以一行一行读取。十九、为什么读取文件后会多空行这个问题刚开始读文本文件时很容易遇到。因为文件中的每一行结尾通常已经存在\n而print()默认自己还会再添加一个换行。所以print(line)看起来可能会多出空行。可以写成print(line,end)取消print()自带的换行。二十、readlines()如果想一次性把文件内容全部读出来可以使用f.readlines()返回的是一个列表。列表中的每一个元素对应文件中的一行。例如fopen(d:/test.txt,r)linesf.readlines()print(lines)f.close()二十一、中文乱码和字符编码如果文件里面有中文读取文件的时候可能出现异常 乱码这时候就涉及字符编码。计算机本身只能保存二进制数据所以文字需要通过编码方式转换成数字。常见的中文编码方式有GBK UTF-8一个非常重要的原则就是文件本身的编码方式要和 Python 读取时使用的编码方式匹配。如果文件是 UTF-8可以显式写fopen(d:/test.txt,r,encodingutf8)这样就可以明确指定编码。二十二、为什么会出现乱码假设文件实际使用的是UTF-8但是程序却按照GBK去解释里面的数据。那么同一串二进制数据被不同的编码方式解释以后就可能出现乱码甚至直接抛出异常。所以以后碰到文件有中文 读取出错 打开显示乱码第一时间就应该想到编码方式是不是不匹配。二十三、with上下文管理器每次open()然后再close()虽然没问题但是很容易忘记关闭文件。Python 提供了更加方便的方式with例如withopen(d:/test.txt,r,encodingutf8)asf:linesf.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 ↓ 文件后面写程序的时候不再只是进行简单的计算而是可以把数据组织起来、封装逻辑并把数据真正保存到文件中。