29.企业级开发进阶1:文件输入输出流[IO操作]

农历五月初一
宜声明变量"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被输入到程序中了
29.企业级开发进阶1:文件输入输出流[IO操作]_第1张图片
内存中的数据读取

同样,运行中的程序,可以将数据永久保存到文件中【向文件中输出数据】,也可以从文件中读取数据到程序中使用【读取文件数据输入到程序中】


29.企业级开发进阶1:文件输入输出流[IO操作]_第2张图片
从文件中读写数据

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()
29.企业级开发进阶1:文件输入输出流[IO操作]_第3张图片
python程序写入文件的数据
  • 向文本文件中追加写入数据,上面的代码执行的结果,会将文件中原来的数据覆盖掉
# 以追加内容的方式打开文件
f = open("d:/test.txt", "a")

# 向文件中追加内容
f.write("这是新的内容")

# 操作完成,记得关闭文件哦
f.close()

我们打开文件可以看到,原来的数据还在,新的数据被追加到了后面


29.企业级开发进阶1:文件输入输出流[IO操作]_第4张图片
追加写入数据
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="")这是一个将字符串转换成字节数组的函数,写入完成后查看文件内容如下:


29.企业级开发进阶1:文件输入输出流[IO操作]_第5张图片
红色部分是写入的二进制数据

输入输出流扩展:当我们开始操作文件的过程中,不可避免的由于文件是否存在,文件内存是否可写等等为让程序出现异常情况,所以我们要对文件操作进行异常处理,常规的处理方式有两种,如下:

  • try-except-finally处理方式
  • with语句处理方式

第一种方式:try-except-finally包含,完成文件操作过程

try:
    f = open("d:/test.txt", "+")
    f.write("写入文件中的内容")
    f.flush()

4. python中对内存IO

python程序对数据的输入输出,不一定都是针对文件的,也可以是针对内存的处理
常规情况下,python提供了StringIOBytesIO两个内置类来进行内存中数据的处理
注意:需要引入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")

对于文件和文件夹的初步操作,暂时先分析到这里,再后面的章节中学习过多线程等操作之后再深入分析


大牧莫邪.png

你可能感兴趣的:(29.企业级开发进阶1:文件输入输出流[IO操作])