Python从入门到精通(十九)Python对文件的读写操作一览表,非常实用,非常简单

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python从入门到精通(十九)Python对文件的读写操作一览表,非常实用,非常简单相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
本文重点介绍Python对文件的读写操作,这是一个非常重要的知识点。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

前言

上一篇文章我们介绍了Python对文件夹的各种操作,但是对文件的读写操作没涉及,所以,这篇文章就是来介绍Python对文件的读写操作。

open函数

Python对文件的操作比较方便。没有像Java那样整那么多IO操作类。首先欢迎open函数粉墨登场,该函数主要是用来创建或者打开文件的,其语法格式是:

file=open(filename, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

file: 表示要创建的文件对象。
file_name:要创建或打开的文件的文件名称,该名称要用引号括起来,需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可。否则此参数需要指定打开文件所在的完整路径。
mode:可选参数,用于指定文件的打开模式,可选的打开模式如下表所示。如果不写,则默认以只读(r)模式打开文件。
buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。如果buffering参数的值为0(或者False)则表示在打开指定文件时不使用缓冲区;如果buffering参数值为大于1的整数,该整数用于缓冲区的大小(单位是字节);如果buffering参数的值为负数,则表示使用默认的缓冲区大小。默认情况下open函数是打开缓冲区的。
encoding: 手动设置打开文件时所使用的编码格式,不同平台的ecoding参数值也不同,以Windows为例,其默认的GBK编码。

              表1. open函数支持的文件打开模式
模式含义注意事项
r只读模式打开文件,读文件内容的指针会放在文件的开头操作的文件必须存在
rb以二进制格式,采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件操作的文件必须存在
r+打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容操作的文件必须存在
rb+以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件 (如音频文件)操作的文件必须存在
w以只写模式打开文件,若该文件存在,打卡时会清空文件中原有的内容若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
wb以二进制格式,只写模式打开文件,一般用于非文本文件(如音频文件)若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
w+打开文件后,会对原有内容进行清空,并对该文件有读写权限若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
wb+以二进制格式,读写模式打开文件,一般用于非文本文件
a以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件
ab以二进制格式打开文件,并采用追加模式,对文件只有写权限,如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件
a+以读写模式打开文件,如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件
ab+以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件

从上表我们可以得出如下结论:

  1. 模式中带b的就是以二进制格式打开文件,比如模式 rb;wb;ab
  2. 模式中带+的就是以读写模式打开文件,说白了就是既可以读文件也可以写文件,比如模式 r+;w+;a+;rb+;wb+;ab+
  3. 不带b,或者+的模式,比如r模式就是只读,w模式就是只写,a模式就是只追加文件。

文件的读取

文件的读取有三种方法:

  1. file.read(size)方法,逐个字节或者字符读取文件中的内容。file表示已打开的文件对象,size作为一个可选参数,用于指定一次最多可读取的字符(字节)个数。如果省略,则默认一次性读取所有内容。
  2. file.readline(size)方法:逐行读取文件中的内容。file表示已打开的文件对象,size为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数,可以通过循环的方式来读取文件中的全部内容
  3. file.readlines() 方法:一次性读取文件中多行内容,读取的结果以列表的形式返回。

举个例子吧!现创建一个名为my_file.txt的文件,文件中有如下内容:

全网同名:码农飞哥
这是Python系列的第十八篇文章
https://feige.blog.csdn.net/

下面分别用介绍的三种方法来读取该文件中的所有内容:

# 读取文本文件
print("*********read方法读取全部内容**********")
f = open('my_file.txt', encoding='utf-8')
print(f.read())
f.close()

print("*********readline方法读取全部内容**********")
f = open('my_file.txt', encoding='utf-8')
line_txt = f.readline()
while line_txt:
    print(line_txt)
    line_txt = f.readline()
f.close()

print("*********readline方法读取全部内容**********")
f = open('my_file.txt', encoding='utf-8')
print(f.readlines())

运行的结果是:

*********read方法读取全部内容**********
全网同名:码农飞哥
这是Python系列的第十八篇文章
https://feige.blog.csdn.net/
*********readline方法读取全部内容**********
全网同名:码农飞哥

这是Python系列的第十八篇文章

https://feige.blog.csdn.net/
*********readline方法读取全部内容**********
['全网同名:码农飞哥\\n', '这是Python系列的第十八篇文章\\n', 'https://feige.blog.csdn.net/']

一般而言,readline函数和readlines函数用于读取文本文件,而read函数则即可读取文本文件又可以读取非文本文件。

文件写入

现有文件write_file.txt,文件中有如下两行内容。

码农飞哥
这是Python系列的第十九篇文章

  1. file.write(str): 其中,file表示已经打开的文件对象;str表示要写入文件的字符串(或字节串,仅适用写入二进制文件中)
    需要注意的是在使用write()向文件中写入数据,需保证使用open()函数是以r+、w、w+、a或者a+模式打开文件,否则执行write()函数会抛出io.UnsupportedOperation 错误。
file = open('write_file.txt', mode='w', encoding='utf-8')
file.write('日拱一卒')
file.close()

通过w模式打开执行write方法写入日拱一卒之后,文件中原有的内容就被清空了。这里需要注意的这里要指定编码为utf-8,因为在window下文件的默认open函数指定的默认编码格式是gbk。用utf-8格式打开文件可能会出现乱码。

  1. file.writelines(str):
    其中,file表示已经打开的文件对象,str表示要写入文件的内容,可以支持多行数据的写入。
file = open('write_file.txt', mode='w', encoding='utf-8')
file2 = open("my_file.txt", encoding='utf-8')
file.writelines(file2.read())
file.close()

这里读取的文件的编码和写入的文件编码需要保持一致。不然,就会报UnicodeDecodeError编码错误。写入之后会清空文件的原有内容。

各种模式的介绍

只读模式(只读数据r)

创建一个名为my_file.txt的文件,文件有如下内容:

全网同名:码农飞哥
这是Python系列的第十八篇文章
https://feige.blog.csdn.net/
  1. 通过二进制的方式(rb)打开图片,针对二进制文件(图片,视频等)的话只能使用rb方式来读取文件。
f = open('my_file.txt', 'rb')
f_bytes = f.read()
print(f_bytes)
print(f_bytes.decode('utf-8'))
f.close()

运行结果是:

b'\\xe5\\x85\\xa8\\xe7\\xbd\\x91\\xe5\\x90\\x8c\\xe5\\x90\\x8d\\xef\\xbc\\x9a\\xe7\\xa0\\x81\\xe5\\x86\\x9c\\xe9\\xa3\\x9e\\xe5\\x93\\xa5\\n\\xe8\\xbf\\x99\\xe6\\x98\\xafPython\\xe7\\xb3\\xbb\\xe5\\x88\\x97\\xe7\\x9a\\x84\\xe7\\xac\\xac\\xe5\\x8d\\x81\\xe5\\x85\\xab\\xe7\\xaf\\x87\\xe6\\x96\\x87\\xe7\\xab\\xa0\\nhttps://feige.blog.csdn.net/'
全网同名:码农飞哥
这是Python系列的第十八篇文章
https://feige.blog.csdn.net/
*********readline方法读取全部内容**********
全网同名:码农飞哥
这是Python系列的第十八篇文章

只写模式(重写数据w)

  1. 以二进制的方式写入数据
    如下代码就是将图片demo.jpg的内容写入到图片demo1.jpg中,如果demo1.jpg文件不存在则会先创建一个文件。
write_file = open('demo1.jpg', mode='wb')
read_file = open('demo.jpg', mode='rb')
write_file.write(read_file.read())
read_file.close()
write_file.close()
  1. 只写模式追加数据
    如下就是在append_file.txt文件中追加好好加油数据,a的话是只写模式
append_file = open('append_file.txt', mode='a', encoding='utf-8')
append_file.write("\\n好好加油")
append_file.close()

读写模式(追加数据a)

前面介绍的以w开头的模式,如果被写入文件中原有数据则会被覆盖。如果不想原有数据被覆盖可以使用追加写入数据的方式。
读写模式下可以调用read()方法进行读,也可以调用write方法进行写。

read_write_file = open('append_file.txt', mode='r+', encoding='utf-8')
print(read_write_file.read())
read_write_file.write('\\n努力向上,天天向上')
print(read_write_file.read())
read_write_file.close()

运行结果是:

全网同名:码农飞哥
这是Python系列的第十八篇文章
https://feige.blog.csdn.net/

需要注意的是read方法只能调用一遍。read函数只能读取写入之前的数据,如果要读取写入之后的数据需要重新调用open函数。

with as用法详解

我们注意文件操作完之后需要手动调用close()方法关闭文件流。实际开发中建议将调用close函数的代码块放在finally块中以防止出现异常导致文件流不能被关闭。标准的使用方式是:

f = open('my_file.txt', encoding='utf-8')
try:
    print(f.read())
finally:
    f.close()

那么,有没有更加便捷的方式呢?答案是有的:那就是通过with as 语句来操作文件。其语法格式是:

with 表达式 [as target]:
    代码块

此格式中,用[]括起来的部分可以使用,也可以省略。其中,target参数用于指定一个变量,该语句会将表达式指定的结果保存到该变量中。with as 语句中的代码块如果不想执行任何语句,可以直接使用 pass 语句代替。
用with as改造上面的代码就是:

with open('my_file.txt', encoding='utf-8') as f:
    print(f.read())

不用手动关闭文件流。

总结

本文详细介绍了Python对文件的读写操作,其实本质上就是open函数的各种模式的熟练运用。一般而言,只读的场景用rb,只写的场景有wb,追加的场景用ab。

Python知识图谱

为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。


我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。

我是码农飞哥,再次感谢您读完本文

以上是关于Python从入门到精通(十九)Python对文件的读写操作一览表,非常实用,非常简单的主要内容,如果未能解决你的问题,请参考以下文章

Flask框架从入门到精通之模板宏(十九)

MySQL从入门到精通高级篇(二十九)覆盖索引的使用&索引下推

MySQL从入门到精通高级篇(二十九)覆盖索引的使用&索引下推

Flask框架从入门到精通之模板宏(十九)

Flask框架从入门到精通之模板宏(十九)

MySQL从入门到精通高级篇(十九)索引的分类&创建索引的三种方式&删除索引的两种方式