进阶学Python:Python的open函数之文件处理!

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

📖前言

马尔克斯在《百年孤独》里写道:

“过去都是假的,回忆是一条没有归途的路。 以往的一切春天都无法复原,即使最狂乱且坚韧的爱情,归根结底也不过是一种转瞬即逝的现实,唯有孤独永恒。”

关于安装和汉化可以观看博主的这篇文章《VsCode下载安装及汉化 》以及Python系列:windows10配置Python3.0开发环境!,安装完毕重启VsCode!


🚀Come on!文件处理的流程:

  1. 打开文件,得到文件句柄并将其赋值给一个变量

  2. 通过文件句柄对文件进行操作(其实文件句柄本身是一个迭代器对象。)

  3. 关闭文件(即释放操作系统分配的内存空间)

请先创建一个 test.txt 文件(根目录下)

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-15 09:26:11
'''

#1、以只读模式打开文件,获得文件句柄并赋值给f变量
f =open("test.txt","r",encoding="utf-8")
#2、读取文件
print(f.read())
#3、关闭文件
f.close()
复制代码

从上述示例中,“r”->只读模式打开文件,接下来看一下文件打开有哪些模式:


✨文件模式

  1. 打开文件的模式有:
  • r-->只读模式。默认模式,文件必须存在,不存在则抛出异常。
  • w-->只写模式。不可读,文件存在则删除文件内容,不存在则创建。
  • a-->追加模式。可读,文件存在则追加在文件末尾,不存在则创建。
  1. 打开非文本文件时,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
  • rb-->以字节的方式读取文件
  • wb-->以字节的方式写入文件
  • ab-->以字节的方式追加入文件
  1. "+" 表示可以同时读写某个文件
  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

在了解打开文件的各种打开模式时,需要对文件的编码有一定的了解。


🐱‍🏍文件的字符编码

了解文件编码时我们需了解一下几个点:

  1. 由于文件在硬盘中是以字节的方式存储的,而故在打开文本文件时需要需要指定文件的编码encoding="编码类型",写入文件也时需要指定译码格式,encoding="编码类型。"

  2. 文件以什么编码类型写入,必须以什么编码读取。即若文件若以“utf-8”的编码类型写入,就必须以“utf-8”的编码类型读取,否则会发生乱码。

  3. 一个文本文件内,只允许有一种编码类型,否则也会发生乱码。

  4. 字符串数据类型转为字节格式:encode(),字节格式转为字符串数据类型:decode()。

注:b模式,无需指定编码类型,因为其本身就是直接从内存中读取字节格式,而若想将读取的字节编码以字符串类型显示则需要译码成指定格式,即decode()。

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-09 18:20:20
'''
#创建新文件buffer,指定编码格式为utf-8
f1=open("buffer.txt","w",encoding="utf-8")
f1.write("hello world.")
f1.write("你好世界")
f1.close()

#打开该文件,若以其他编码格式打开则会出现乱码
f2=open("buffer.txt","r",encoding="gbk")
print(f2.read())
f2.close()

#输出为:hello world.浣犲ソ涓栫晫
复制代码

💕来点实例:(下面的实例请到上面创建的 buffer.txt 看效果)

r模式-->只读模式,读取的文件必须是事先存在的,否则报错

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-09 18:20:20
'''
#r-->只读模式
f =open("buffer.txt","r",encoding="utf-8")
# print(f.read()) #read->读取文件内容,读取完文件句柄停留在最后
# print(f.readline(),end="") #逐行读取,读完后文件句柄停留在下一行的行首
# print(f.readline())
print(f.readlines()) #逐行读取,并且将每行添加至空列表中,并返回列表
f.close()
复制代码

🎊w 模式-->只写模式,文件存在则覆盖式写入,文件不存在则创建新文件

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-15 09:35:52
'''

# w->只写模式
fw =open("buffer.txt","w",encoding="utf-8")
fw.write("取代-->原内容]\n") #写入,并且覆盖
fw.writelines(["hello world.\n","你好,世界。"]) #以列表的方式逐行写入
fw.close()
复制代码

🤦‍♀️a模式->追加模式,文件存在则追加式写入,文件不存在则创建新文件

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-09 18:20:20
'''

#a->追加模式
fa=open("buffer.txt","a",encoding="utf-8")
fa.write("\n这是追加模式,并非覆盖")
fa.close()
复制代码

🙌r+模式->读写模式,可读可写,写入是以追加的方式写入

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-15 09:37:17
'''

#r+->读写模式,必须先读后写
fr1=open("buffer.txt","r+",encoding="utf-8")
print(fr1.read())
fr1.write("\nMy name is YongJia_Chen,I'm 21 years old.") #追加的方式写入
fr1.close()

#w+->写读模式,先清空再写入
fr2=open("buffer.txt","w+",encoding="utf-8")
print(fr2.read())
fr2.write("\nMy name is YongJia_Chen,I'm 21 years old.")
fr2.close()
复制代码

🎇b模式

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-15 09:38:54
'''

#rb模式
#由于文件的在硬盘中的存储就是以二进制的方式存取的,而b模式本身就是指定以二进制的字节方式读取, 故不需要指定以何种编码方式读取
f =open("test.txt","rb")
data =f.read()
print(data.decode("utf-8")) #读取出来是字节,故decode转换为字符串格式
f.close()

#wb模式
#同理,写入也必须以字节的方式写入。
f= open("test.txt","wb")

#转换为字节格式的两种方式:
#①bytes内置函数
f.write(bytes(b"hello,this world.\n"))
f.write(bytes("你好,阿中我爱你!\n",encoding="utf-8"))

#②encode()方法
f.write("你好,世界。".encode("utf-8"))
#由于python默认以utf-8的编码方式编码的,故若以其他的编码方式写入,则该文件内会出现乱码
# f.write("哈哈哈,我可真博学。".encode("gbk"))
f.close()
复制代码

💖文件的其他操作方法:

'''
@Descripttion: 这是一个文件头注释!
@version: 1.0.0
@Company: DCIT-SH
@Author: Sunny Chen
@Date: 2019-10-09 18:20:20
@LastEditors: Sunny Chen
@LastEditTime: 2019-10-15 09:41:59
'''

#①、tell()-->查看文件句柄所在位置,以字节为单位。即对于中文以utf-8编码,处理为3个字节。
f1 = open("demo.txt","r",encoding="utf-8",newline="")
# print(f1.readlines()) #文件读取一行,光标移动到下一行的最前面
print(f1.readline())
print(f1.tell()) #中文为三个字节,同时加上\r\n
f1.close()

#②seek(int)-->移动文件句柄即光标的位置,也是以字节为单位。
f2 = open("demo.txt","r+",encoding="UTF-8")
f2.seek(8) #将文件句柄移至字节为8的位置
f2.write("你好")
print(f2.tell()) #获取文件句柄位置
f2.close()

#③#truncate(int)-->本质为写操作,必须在r+或者a+模式下进行,截取文件内容
f3 = open("demo.txt","r+",encoding="UTF-8")
f3.truncate(8)
# f3.truncate(10) #截取,使用字节为单位截取的,而一个中文在utf-8中用三个字节表示,若截取的字节在一个中文所表示的字节内,则会发生乱码的现象
f3.close()

#④flush()->刷新,即操作文件时,是将文件加载到内存中进行操作的,而对文件进行操作时,通过flush可以将数据加载回硬盘中。
f4=open("test.txt","r+",encoding="utf-8")
f4.write("\nthis is end line")
f4.flush()
f4.close()
复制代码

至于更多的属性的意义我就不在这里列出了,可以自行百度一下哦~

快去动手试试吧!


🎉最后

  • 更多参考精彩博文请看这里:陈永佳的博客

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!