农历五月初一
宜声明变量"a",提交代码;忌打DOTA,提交BUG
适宜方位:坐西朝东
多饮水、鲜奶,女神亲近指数较高
进入正题
本节内容如下:
- 什么是IO
- 文件内容操作
- 操作文本文件
- 操作二进制文件
- 内存IO
- 初步认识io模块
- 目录和文件的操作
- 初步认识os模块
- 文件的创建、重命名、删除
- 目录的创建、重命名、删除
- 序列化操作
1. 什么是IO
IO:Input/Output~输入/输出的意思
任何编程语言,核心都是对数据的处理,对数据的处理一般情况下就是指代数据的输入和输出
常规情况下,我们在程序运行的过程中,将数据频繁的输入或者输出到计算机的内存中,让程序正常的运行;
由于程序中的数据并不是能持久保存的,所以在一些情况下,我们将数据输入或者输出到计算机中的文件中来进行永久保存;
所以各种编程语言中,都提供了丰富并且完善的输入输出流的API接口控制数据的输入和输出(读/写)~
运行中的程序,可以将数据临时保存在内存中【向内存中输出数据】,也可以将内存中的数据读取出来在程序中使用【向程序中输入数据】
num = 12 # 将一个数据12,赋值给变量num,num和对象12被输出保存到计算机内存中了
print (num) # 将内存中num对应的数据12读取到程序中进行答应,num和对应的对象数据12被输入到程序中了
同样,运行中的程序,可以将数据永久保存到文件中【向文件中输出数据】,也可以从文件中读取数据到程序中使用【读取文件数据输入到程序中】
2. python中的输入/输出
python中提供了标准的输入/输出的语法结构,在之前的章节中已经进行过介绍,我们这里简单回顾一下即可
标准输入:input()
函数操作用于接收用户数据,保存数据的过程就可以将数据写入到内存中
标准输出:print()
函数用于将指定的数据输出到控制台进行展示
msg = input("请输入个人介绍:")
print("个人介绍:" + msg)
3. python中对文件内容的操作
文件内容也是一种数据,对数据的操作一般情况下可归结为增删改查四种方式
对文件内容的操作,可以归结为读取、覆盖、追加的操作。
python中对文件内容的操作主要是通过open()函数进行处理的,open()函数的简单语法结构如下:
open(file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# file:是要操作的文件,这里是完整的问文件路径+文件名称,如:d:/test.txt
# mode:是操作默认,默认是r,表示可读的
#### 常规选项如下:
#### r #### 表示文件以可读的方式打开,打开的文件只能读取文件数据,不能修改
#### w #### 表示文件以可写的方式打开,可以操作文件中的数据,不能做其他操作
#### x #### 表示文件以执行的方式打开,主要用于进行文件创建等操作
#### a #### 表示文件内容以追加的方式打开,向文件写入数据不会覆盖原来的数据
#### b #### 表示文件以二进制的方式进行处理,可以操作二进制数据
#### t #### 表示文件以文本的方式进行处理,也是默认的方式
#### + #### 表示文件以读写的方式进行处理,是rw结合起来的用法
#### U #### 表示使用通用的内容换行的方式进行处理
# buffering:表示读写内容的缓冲区,如果设置为0表示关闭缓冲区,通常情况下我们会使用io.DEFAULT_BUFFER_SIZE这个默认值,在不同的操作系统中是4096/8192字节的长度
# encoding:打开文件的编码,这个选项只能用于操作文本文件的情况下,这个选项的默认值跟文件所在的操作系统有关
# errors:这个选项主要用于在encoding选项进行编码和解码出现错误时的操作,值是一个字符串,python已经封装了字符串对应的处理功能;常规的选项如下:
#### strict #### 使用严格模式进行处理,如果出现错误就抛出ValueError异常信息
#### ignore #### 忽略出现的错误,这里需要注意,忽略编码错误会导致数据丢失的!
#### replace #### 如果出现编码错误,使用特殊符号替换错误的编码,如符号?
# newline:选项用于控制mode为U时自动换行的处理,可以是如下选项中的一种
#### "None"、""、"\n"、"\r"、"\r\n"
3.1. 操作文本文件
- 读取文本文件中的数据,可以使用
read()
函数读取所有数据或者read(size)
读取指定长度的数据或者readlines()
读取整行数据
# 以只读的方式打开系统中d:/test.txt文本文件,读取其中的数据
f = open("d:/test.txt", "r")
# 读取数据到程序中
content = f.read()
# 使用读取到的数据
print(content)
# 操作结果,记得关闭文件哦
f.close()
# 执行结果:d:/test.txt中的数据被完整的读取出来了
~hello python!
~输入输出流测试数据!
上述代码在执行时,如果操作的文件不存在就会出现如下错误,请按照之前的错误调试章节的内容分析一下错误
Traceback (most recent call last):
File "D:/resp_work/PY_WORK/备课/模块化开发/demo06/demo01文件操作.py", line 3, in
f = open("d:/testtxt", "r")
FileNotFoundError: [Errno 2] No such file or directory: 'd:/test.txt'
另外,在读取文件数据时,一定要注意文件的编码格式,通常情况下都是使用当前操作系统默认的编码,也就是在函数处理时忽略encoding选项;如同下面的情况就会出现问题:
我当前系统的默认编码是gbk编码,在d:盘下创建了一个test2.txt文件,文件编码修改成了utf-8编码,此时执行如下代码:
f = open("d:/test2.txt", "r")
content = f.read()
print(content)
f.close()
我们可以看到和前面的代码没有任何区别,但是执行出现如下问题:
Traceback (most recent call last):
File "D:/resp_work/PY_WORK/备课/模块化开发/demo06/demo01文件操作.py", line 26, in
content = f.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 8: illegal multibyte sequence
这是一个什么样的问题呢:报错提示UnicodeDecodeError
也就是编码错误,我们修改程序代码
f = open("d:/test2.txt", "r", encoding="utf-8")
content = f.read()
print(content)
f.close()
重新执行程序,数据正常读取了
这是新的文件内容
- 向文本文件中写入数据,一般情况下,可以通过
write()
函数或者writelines()
函数向文件中写入数据
# 以可写的方式打开d:/test.txt文件
# 这里请注意,open()函数的mode是w模式,如果目标文件不存在就会自动创建这个文件
f = open("d:/test.txt", "w")
# 通过write()函数向文件中写入数据
f.write("这是Python从程序中写入到文件的数据")
# 操作完成,一定记得关闭文件哦
f.close()
- 向文本文件中追加写入数据,上面的代码执行的结果,会将文件中原来的数据覆盖掉
# 以追加内容的方式打开文件
f = open("d:/test.txt", "a")
# 向文件中追加内容
f.write("这是新的内容")
# 操作完成,记得关闭文件哦
f.close()
我们打开文件可以看到,原来的数据还在,新的数据被追加到了后面
3.2. 操作二进制文件
- 以二进制的方式打开文件读取文件中的数据【文本文件也可以按照二进制文件的方式读取】
# 按照二进制的方式读取文件,mode可以设置为rb两个选项配合
f = open("d:/test.txt", "rb")
# 读取文件数据
content = f.read()
# 使用文件中的数据
print(content)
# 操作完毕,记得关闭文件哦
f.close()
# 执行结果如下:
~b'\xd5\xe2\xca\xc7Python\xb3\xcc\xd0\xf2\xd0\xb4\xc8\xeb\xce\xc4\xbc\xfe\xb5\xc4\xca\xfd\xbe\xdd\xd5\xe2\xca\xc7\xd0\xc2\xb5\xc4\xc4\xda\xc8\xdd'
- 以二进制的方式,向文件中写入数据
# 定义要写入文件中的内容
s = "这是python按照二进制写入的数据"
# 按照二进制的方式打开文件追加内容,mode可以设置为ab两个选项配合
f = open("d:/test.txt", "ab")
# 向文件中写入数据
f.write(bytes(s, encoding="utf-8"))
# 使用文件中的数据
print(content)
# 操作完毕,记得关闭文件哦
f.close()
bytes(str, encoding="")这是一个将字符串转换成字节数组的函数,写入完成后查看文件内容如下:
输入输出流扩展:当我们开始操作文件的过程中,不可避免的由于文件是否存在,文件内存是否可写等等为让程序出现异常情况,所以我们要对文件操作进行异常处理,常规的处理方式有两种,如下:
- try-except-finally处理方式
- with语句处理方式
第一种方式:try-except-finally包含,完成文件操作过程
try:
f = open("d:/test.txt", "+")
f.write("写入文件中的内容")
f.flush()
4. python中对内存IO
python程序对数据的输入输出,不一定都是针对文件的,也可以是针对内存的处理
常规情况下,python提供了StringIO
和BytesIO
两个内置类来进行内存中数据的处理
注意:需要引入python中的io模块
-
StringIO
:在内存中读写字符串的内置类 -
BytesIO
:在内存中读写二进制数据的内置类
4.1 内存中读写字符串
- 内存中读写字符串
常规情况下就是创建一个StringIO
对象,然后按照正常的文件读写的方式进行内容的读写即可
# 引入需要的模块
from io import StringIO
# 创建StringIO对象
s = StringIO()
# 向内存中写入数据
s.write("保存在内存中的数据:用户名")
s.write("内容默认是追加的")
# 从内存中读取数据
content = s.getvalue()
print(content)
# 操作完成,适当的时刻关闭对象
s.close()
- 内存中操作二进制数据:和StringIO基本一致
# 引入需要的模块
from io import BytesIO
# 定义要写入的数据,使用bytes()函数转换成二进制数据
s = "这是要写入的数据"
sc = bytes(s, encoding="utf-8")
# 创建BytesIO对象
b = BytesIO()
# 向内存中写入数据
b.write(sc)
# 从内存中读取数据
content = b.getvalue()
print(content)
# 操作完成,适当的时刻关闭对象
s.close()
# 执行结果
~b'\xe8\xbf\x99\xe6\x98\xaf\xe8\xa6\x81\xe4\xbf\x9d\xe5\xad\x98\xe7\x9a\x84\xe6\x95\xb0\xe6\x8d\xae'
5. python中对目录/路径/文件夹的操作
本节内容所有的操作,其实都是和计算机交互的操作~操作计算机的内存、文件等等,python程序本身是做不了这些事情的,只是python在底层进行了和操作系统交互的功能封装,将操作系统可以执行的诸如创建文件、文件内容操作、内存操作等等封装成了函数
简单了解os模块,os模块主要是针对操作系统的API的封装
# 引入os模块
import os
# 查看操作系统类型
# nt表示windows操作系统;posix表示Unix/Linux或者MacOS系统
os.name
~ 执行结果:nt
# 查看操作系统中的环境变量
os.environ
~执行结果:environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\mouwe\\AppData\\Roaming',.................'CLASSPATH': 'D:\\resp_application\\Java\\jdk1.8.0_121\\lib;.;',})
5.1. 操作文件目录
# 查看当前操作系统的绝对路径
os.path.abspath(".")
~ 执行结果:D:\resp_work\PY_WORK\demo
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 创建指定单级目录
# 语法结构:os.mkdir(path, mode=, dir_fd=None)
# 描述:mkdir()函数用于使用指定的mode选项来创建一个文件夹目录
# 参数path:用于创建文件夹的路径
# 参数mode:用于设置的权限数字,默认777(所有权限:读写执行[rwx])
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 在d盘中创建一个目录,目录名称为test
os.mkdir("d:/test")
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 创建指定多级目录
# 语法结构:os.mkdirs(path, mode=, exist_ok=False)
# 描述:makedirs()函数用于使用指定的mode选项来创建一系列文件夹目录
# 参数path:用于创建文件夹的路径
# 参数mode:用于设置的权限数字,默认777(所有权限:读写执行[rwx])
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 在d盘中创建test文件夹,文件夹中包含test2文件夹,test2中包含test3文件夹
os.mkdirs("d:/test/test2/test3")
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 重命名
# 语法结构:os.rename(old, new)
# 描述:rename()函数用于使用新名称重命名文件夹或者文件
# 参数old:要重命名的文件
# 参数new:文件的新名称
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.rename("d:/test", "d:/new")
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 删除文件或者目录
# 语法结构:os.rmdir(path)
# 描述:rmdir()函数用于删除指定路径的文件夹或者文件
# 参数path:要删除的文件夹或者文件的路径
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.rm("d:/test")
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 删除多级文件夹
# 语法结构:os.removedirs(path)
# 描述:removedirs(path)
# 参数path:要删除的多级文件夹路径
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.removedirs("d:/test/test2/test3")
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 同样在进行文件夹或者文件删除的时候,首先要进行数据验证
# 也就是首先判断是文件夹/文件,才去执行删除操作
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# os.path.exists(path)函数用于判断指定的路径是否存在,存在返回True
res = os.path.exists("d:/test")
# os.path.isdir(path)函数用于判断指定的路径是否文件夹,是则返回True
res = os.path.isdir("d:/test")
# os.path.isfile(path)函数用于判断指定的路径是否文件,是则返回True
res = os.path.isfile("d:/test")
对于文件和文件夹的初步操作,暂时先分析到这里,再后面的章节中学习过多线程等操作之后再深入分析