Python基础10
学习10
文件操作(IO技术)
有基础的同学知道,很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的,本章我们就学习文件的相关操作。
文本文件和二进制文件
1、文本文件
文本文件存储的是普通“字符”文本,默认为unicode字符集(两个字节表示一个字符,最多可以表示:65536个),可以使用记事本打开。但是,像word软件编辑的文档不是文本文件。
2、二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc文档等等。
文件操作相关模块概念
Python标准库中,文件操作相关模块:
创建文件对象open()
open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径。
比如:D:\a\b.txt。
为了减少 “ \ ” 的输入,可以使用原始字符串:
r “d:\b.txt”。示例如下:
打开方式有如下几种:
文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
文本文件的写入
文本文件的写入一般就是三个步骤:
1、创建文件对象
2、写入数据
3、关闭文件对象(一定要有关闭功能)
例子:
常用编码介绍
在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。
结果:写入之后是乱码
中文乱码问题:
Python程序默认的是unicode,windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK。
解决方案1:
解决方案2:
在编码时就设置为“utf-8”
write()/writtelines()写入数据
write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符
结果:
close()关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。
为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象。
结合异常机制finally确保关闭文件对象:
try中无异常,也会执行finally,当try中有异常,执行except之后,也会执行finally,这样都会执行close()方法。
with语句(上下文管理器)
with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场
文本文件的读取
文件的读取一般使用如下三个方法:
1、 read([size])
从文件中读取 size 个字符([size]表示可选size,不填写也可以),并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
end="" 表示print打印输出后不用自动换行了,print()有自动换行的功能。
2、 readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
3、readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表。
例子:为文本文件每一行的末尾增加行号。
enumerate枚举每一个元素,并且添加序列,并以元组包含起来。
结果:
二进制文件的读取和写入
二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:
创建好二进制文件对象后,仍然可以使用 write()、read()实现文件的读写操作。
文件对象的常用属性和方法
文件对象封装了文件相关的操作。在前面我们学习了通过文件对象对文件进行读写操作。本节我们详细列出文件对象的常用属性和方法,并进行说明。
例子:
读取的内容为:
seek()的用法例子:
使用pickle序列化
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。
序列化我们使用:
pickle.dump(obj, file)
obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file)
从 file 读取数据,反序列化成对象
CSV文件的操作
csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。
Excel文件不同,CSV文件中:
1、值没有类型,所有值都是字符串
2、不能指定字体颜色等样式
3、不能指定单元格的宽高,不能合并单元格
4、没有多个工作表
5、不能嵌入图像图表
csv.reader 对象和 csv 文件读取
执行结果:
[‘姓名’, ‘年龄’, ‘工作’, ‘薪水’]
[‘高淇’, ‘18’, ‘程序员’, ‘50000’]
[‘高老三’, ‘19’, ‘测试工程师’, ‘20000’]
[‘高老五’, ‘20’, ‘人工智能开发’, ‘50000’]
csv.writer 对象和 csv 文件写入
执行结果:
工号,姓名,年龄,地址,月薪
1001,高淇,18,西三旗 1 号院,50000
1002,高八,19,西三旗 1 号院,30000
os 和 os.path 模
os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。
os 模块-调用操作系统命令
os.system 可以帮助我们直接调用系统的命令
Linux 是命令行操作更容易,我们可以通过 os.system 可以更加容易的调用相关的命令。注意:控制台输出中文可能会有乱码问题,可以在 file–>setting 中设置
(解决控制台乱码问题)
os.startfile:直接调用可执行文件
os 模块-文件和目录操作
我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。
os.path 模块
os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作。
列表推导式:
walk()递归遍历所有文件和目录
【示例】使用 walk()递归遍历所有文件和目
shutil 模块(拷贝和压缩)
shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。
os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操作,这些 os 模块都没有提供。
【示例】实现文件的拷贝
【示例】实现递归的拷贝文件夹内容(使用 shutil 模块)
,ignore=shutil.ignore_patterns(".html",".htm")可以忽略不需要的文件。
【示例】实现将文件夹所有内容压缩(使用 shutil模块)
【示例】实现将压缩包解压缩到指定文件夹(使用 shutil 模块)
递归算法
递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是**“自己调用自己”**,一个使用递归技术的方法将会直接或者间接的调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。
递归结构包括两个部分:
例子:使用递归求n!
递归的缺陷
例子: