Python基础10

学习10

文件操作(IO技术)

有基础的同学知道,很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的,本章我们就学习文件的相关操作。

文本文件和二进制文件

1、文本文件
文本文件存储的是普通“字符”文本,默认为unicode字符集(两个字节表示一个字符,最多可以表示:65536个),可以使用记事本打开。但是,像word软件编辑的文档不是文本文件。
2、二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc文档等等。

文件操作相关模块概念

Python标准库中,文件操作相关模块:

python保存为二进制文件 python 二进制文件长度_开发语言

创建文件对象open()

open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])

如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径。

比如:D:\a\b.txt。

为了减少 “ \ ” 的输入,可以使用原始字符串:

r “d:\b.txt”。示例如下:

python保存为二进制文件 python 二进制文件长度_二进制文件_02


打开方式有如下几种:

python保存为二进制文件 python 二进制文件长度_二进制文件_03


文本文件对象和二进制文件对象的创建:

如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。

文本文件的写入

文本文件的写入一般就是三个步骤:
1、创建文件对象
2、写入数据
3、关闭文件对象(一定要有关闭功能)

例子:

python保存为二进制文件 python 二进制文件长度_开发语言_04

常用编码介绍

在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。

python保存为二进制文件 python 二进制文件长度_文本文件_05


结果:写入之后是乱码

python保存为二进制文件 python 二进制文件长度_文本文件_06


python保存为二进制文件 python 二进制文件长度_开发语言_07


中文乱码问题:

Python程序默认的是unicode,windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK。

解决方案1:

python保存为二进制文件 python 二进制文件长度_开发语言_08


解决方案2:

在编码时就设置为“utf-8”

python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_09

write()/writtelines()写入数据

write(a):把字符串 a 写入到文件中

writelines(b):把字符串列表写入文件中,不添加换行符

python保存为二进制文件 python 二进制文件长度_开发语言_10


结果:

python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_11

close()关闭文件流

由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。

python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_12

为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象。

结合异常机制finally确保关闭文件对象:

python保存为二进制文件 python 二进制文件长度_文本文件_13


try中无异常,也会执行finally,当try中有异常,执行except之后,也会执行finally,这样都会执行close()方法。

python保存为二进制文件 python 二进制文件长度_python_14


with语句(上下文管理器)

with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场

python保存为二进制文件 python 二进制文件长度_二进制文件_15

文本文件的读取

文件的读取一般使用如下三个方法:

1、 read([size])

从文件中读取 size 个字符([size]表示可选size,不填写也可以),并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。

python保存为二进制文件 python 二进制文件长度_文本文件_16


python保存为二进制文件 python 二进制文件长度_文本文件_17


python保存为二进制文件 python 二进制文件长度_文本文件_18


end="" 表示print打印输出后不用自动换行了,print()有自动换行的功能。

2、 readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。

3、readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表。

例子:为文本文件每一行的末尾增加行号。

python保存为二进制文件 python 二进制文件长度_二进制文件_19


enumerate枚举每一个元素,并且添加序列,并以元组包含起来。

python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_20


结果:

python保存为二进制文件 python 二进制文件长度_二进制文件_21

二进制文件的读取和写入

二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:

python保存为二进制文件 python 二进制文件长度_python_22


创建好二进制文件对象后,仍然可以使用 write()、read()实现文件的读写操作。

python保存为二进制文件 python 二进制文件长度_文本文件_23

文件对象的常用属性和方法

文件对象封装了文件相关的操作。在前面我们学习了通过文件对象对文件进行读写操作。本节我们详细列出文件对象的常用属性和方法,并进行说明。

python保存为二进制文件 python 二进制文件长度_二进制文件_24

python保存为二进制文件 python 二进制文件长度_python_25


python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_26


例子:

读取的内容为:

python保存为二进制文件 python 二进制文件长度_二进制文件_27

python保存为二进制文件 python 二进制文件长度_开发语言_28


seek()的用法例子:

python保存为二进制文件 python 二进制文件长度_文本文件_29

使用pickle序列化

序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。
序列化我们使用:

pickle.dump(obj, file)
obj 就是要被序列化的对象,file 指的是存储的文件

pickle.load(file)

从 file 读取数据,反序列化成对象

python保存为二进制文件 python 二进制文件长度_开发语言_30


python保存为二进制文件 python 二进制文件长度_文本文件_31

CSV文件的操作

csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。

Excel文件不同,CSV文件中:

1、值没有类型,所有值都是字符串

2、不能指定字体颜色等样式

3、不能指定单元格的宽高,不能合并单元格

4、没有多个工作表

5、不能嵌入图像图表

python保存为二进制文件 python 二进制文件长度_python_32

csv.reader 对象和 csv 文件读取

python保存为二进制文件 python 二进制文件长度_python_33


执行结果:

[‘姓名’, ‘年龄’, ‘工作’, ‘薪水’]

[‘高淇’, ‘18’, ‘程序员’, ‘50000’]

[‘高老三’, ‘19’, ‘测试工程师’, ‘20000’]

[‘高老五’, ‘20’, ‘人工智能开发’, ‘50000’]

csv.writer 对象和 csv 文件写入

python保存为二进制文件 python 二进制文件长度_文本文件_34


执行结果:

工号,姓名,年龄,地址,月薪

1001,高淇,18,西三旗 1 号院,50000

1002,高八,19,西三旗 1 号院,30000

python保存为二进制文件 python 二进制文件长度_文本文件_35

os 和 os.path 模

os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。

os 模块-调用操作系统命令

os.system 可以帮助我们直接调用系统的命令

python保存为二进制文件 python 二进制文件长度_开发语言_36


python保存为二进制文件 python 二进制文件长度_python_37


python保存为二进制文件 python 二进制文件长度_文本文件_38


Linux 是命令行操作更容易,我们可以通过 os.system 可以更加容易的调用相关的命令。注意:控制台输出中文可能会有乱码问题,可以在 file–>setting 中设置

(解决控制台乱码问题)

python保存为二进制文件 python 二进制文件长度_二进制文件_39


os.startfile:直接调用可执行文件

python保存为二进制文件 python 二进制文件长度_二进制文件_40


python保存为二进制文件 python 二进制文件长度_二进制文件_41

os 模块-文件和目录操作

我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。

python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_42


python保存为二进制文件 python 二进制文件长度_开发语言_43

os.path 模块

os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作。

python保存为二进制文件 python 二进制文件长度_python_44


列表推导式:

python保存为二进制文件 python 二进制文件长度_文本文件_45

walk()递归遍历所有文件和目录

python保存为二进制文件 python 二进制文件长度_二进制文件_46


【示例】使用 walk()递归遍历所有文件和目

python保存为二进制文件 python 二进制文件长度_开发语言_47

shutil 模块(拷贝和压缩)

shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。

os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操作,这些 os 模块都没有提供。

【示例】实现文件的拷贝

python保存为二进制文件 python 二进制文件长度_二进制文件_48


【示例】实现递归的拷贝文件夹内容(使用 shutil 模块)

,ignore=shutil.ignore_patterns(".html",".htm")可以忽略不需要的文件。

python保存为二进制文件 python 二进制文件长度_文本文件_49


python保存为二进制文件 python 二进制文件长度_python保存为二进制文件_50

【示例】实现将文件夹所有内容压缩(使用 shutil模块)

python保存为二进制文件 python 二进制文件长度_二进制文件_51


python保存为二进制文件 python 二进制文件长度_二进制文件_52


【示例】实现将压缩包解压缩到指定文件夹(使用 shutil 模块)

python保存为二进制文件 python 二进制文件长度_二进制文件_53

递归算法

递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是**“自己调用自己”**,一个使用递归技术的方法将会直接或者间接的调用自己。

利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。

递归结构包括两个部分:

python保存为二进制文件 python 二进制文件长度_python_54


例子:使用递归求n!

python保存为二进制文件 python 二进制文件长度_开发语言_55


python保存为二进制文件 python 二进制文件长度_开发语言_56


递归的缺陷

python保存为二进制文件 python 二进制文件长度_python_57


例子:

python保存为二进制文件 python 二进制文件长度_文本文件_58