【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+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件 |
从上表我们可以得出如下结论:
- 模式中带b的就是以二进制格式打开文件,比如模式 rb;wb;ab
- 模式中带+的就是以读写模式打开文件,说白了就是既可以读文件也可以写文件,比如模式 r+;w+;a+;rb+;wb+;ab+
- 不带b,或者+的模式,比如r模式就是只读,w模式就是只写,a模式就是只追加文件。
文件的读取
文件的读取有三种方法:
- file.read(size)方法,逐个字节或者字符读取文件中的内容。file表示已打开的文件对象,size作为一个可选参数,用于指定一次最多可读取的字符(字节)个数。如果省略,则默认一次性读取所有内容。
- file.readline(size)方法:逐行读取文件中的内容。file表示已打开的文件对象,size为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数,可以通过循环的方式来读取文件中的全部内容
- 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系列的第十九篇文章
- 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格式打开文件可能会出现乱码。
- 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/
- 通过二进制的方式(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)
- 以二进制的方式写入数据
如下代码就是将图片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()
- 只写模式追加数据
如下就是在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。
我是码农飞哥,再次感谢您读完本文。
- 点赞
- 收藏
- 关注作者
评论(0)