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

农历五月初一
宜声明变量"a",提交代码;忌打DOTA,提交BUG
适宜方位:坐西朝东
多饮水、鲜奶,女神亲近指数较高

进入正题

本节内容如下:

  • 什么是IO
  • 文件内容操作
    • 操作文本文件
    • 操作二进制文件
  • 内存IO
    • 初步认识io模块
  • 目录和文件的操作
    • 初步认识os???/li>
    • 文件的创建、重命名、删除
    • 目录的创建、重命名、删除
  • 序列化操作

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 <module>
    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 <module>
    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()
python程序写入文件的数据
  • 向文本文件中追加写入数据,上面的代码执行的结果,会将文件中原来的数据覆盖掉
# 以追加内容的方式打开文件
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提供了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??橹饕钦攵圆僮飨低车腁PI的封装

# 引入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
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 转换流 输入字节流的转换流:InputStreamReader 是字节流通向字符流的桥InputStreamRea...
    奋斗的老王阅读 3,274评论 0 54
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 这两天看电视剧《外科风云》,每当这个扬帆出场,看到他的模样、他笑着时露出的整齐洁白的牙齿、还有他穿着白大褂去查房的...
    贾雲璞阅读 458评论 2 0
  • 原文 (前秦苻融任冀州牧)有老姥遇劫于路,唱贼,路人为逐擒之。贼反诬路人,时已昏黑,莫知其孰是,乃俱送之。 融见而...
    钟离老酒阅读 523评论 0 0
  • 昨晚和小蕾在西安的万达见面,她是我的大学舍友,在北京某外企工作,毕业之后我们十年没见,最近到西安来出差,我们才有了...
    黄河大侠NO1阅读 273评论 0 0