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

举报
码农飞哥 发表于 2021/08/15 11:45:56 2021/08/15
【摘要】 Python操作文件是真的比Java简单

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
本文重点介绍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。

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。