首页 > Python > Python文件操作(I/O)
Python read()函数:按字节(字符)读取文件
《Python open()函数》一节中,介绍了如何通过 open() 函数打开一个文件。在其基础上,本节继续讲解如何读取已打开文件中的数据。
Python 提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:
本节先讲解 read() 函数的用法,readline() 和 readlines() 函数会放到后续章节中作详细介绍。
举个例子,首先创建一个名为 my_file.txt 的文本文件,其内容为:
当然,我们也可以通过使用 size 参数,指定 read() 每次可读取的最大字符(或者字节)数,例如:
除此之外,对于以二进制格式打开的文件,read() 函数会逐个字节读取文件中的内容。例如:
另外需要注意的一点是,想使用 read() 函数成功读取文件内容,除了严格遵守 read() 的语法外,其还要求 open() 函数必须以可读默认(包括 r、r+、rb、rb+)打开文件。举个例子,将上面程序中 open()的打开模式改为 w,程序会抛出
举个例子,如果目标文件的编码格式为 GBK 编码,而我们在使用 open() 函数并以文本模式打开该文件时,手动指定 encoding 参数为 UTF-8。这种情况下,由于编码格式不匹配,当我们使用 read() 函数读取目标文件中的数据时,Python 解释器就会提示
要解决这个问题,要么将 open() 函数中的 encoding 参数值修改为和目标文件相同的编码格式,要么重新生成目标文件(即将该文件的编码格式改为和 open() 函数中的 encoding 参数相同)。
除此之外,还有一种方法:先使用二进制模式读取文件,然后调用 bytes 的 decode() 方法,使用目标文件的编码格式,将读取到的字节串转换成认识的字符串。
举个例子:
Python 提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:
- read() 函数:逐个字节或者字符读取文件中的内容;
- readline() 函数:逐行读取文件中的内容;
- readlines() 函数:一次性读取文件中多行内容。
本节先讲解 read() 函数的用法,readline() 和 readlines() 函数会放到后续章节中作详细介绍。
Python read()函数
对于借助 open() 函数,并以可读模式(包括 r、r+、rb、rb+)打开的文件,可以调用 read() 函数逐个字节(或者逐个字符)读取文件中的内容。read() 函数的基本语法格式如下:如果文件是以文本模式(非二进制模式)打开的,则 read() 函数会逐个字符进行读取;反之,如果文件以二进制模式打开,则 read() 函数会逐个字节进行读取。
file.read([size])
其中,file 表示已打开的文件对象;size 作为一个可选参数,用于指定一次最多可读取的字符(字节)个数,如果省略,则默认一次性读取所有内容。举个例子,首先创建一个名为 my_file.txt 的文本文件,其内容为:
Python教程
https://www.xinbaoku.com/python/
#以 utf-8 的编码格式打开指定文件 f = open("my_file.txt",encoding = "utf-8") #输出读取到的数据 print(f.read()) #关闭文件 f.close()程序执行结果为:
Python教程
https://www.xinbaoku.com/python/
注意,当操作文件结束后,必须调用 close() 函数手动将打开的文件进行关闭,这样可以避免程序发生不必要的错误。
当然,我们也可以通过使用 size 参数,指定 read() 每次可读取的最大字符(或者字节)数,例如:
#以 utf-8 的编码格式打开指定文件 f = open("my_file.txt",encoding = "utf-8") #输出读取到的数据 print(f.read(6)) #关闭文件 f.close()程序执行结果为:
Python
显然,该程序中的 read() 函数只读取了 my_file 文件开头的 6 个字符。再次强调,size 表示的是一次最多可读取的字符(或字节)数,因此,即便设置的 size 大于文件中存储的字符(字节)数,read() 函数也不会报错,它只会读取文件中所有的数据。
除此之外,对于以二进制格式打开的文件,read() 函数会逐个字节读取文件中的内容。例如:
#以二进制形式打开指定文件 f = open("my_file.txt",'rb+') #输出读取到的数据 print(f.read()) #关闭文件 f.close()程序执行结果为:
b'Python\xe6\x95\x99\xe7\xa8\x8b\r\nhttps://www.xinbaoku.com/python/'
可以看到,输出的数据为 bytes 字节串。我们可以调用 decode() 方法,将其转换成我们认识的字符串。有关 bytes 字节串,读者可阅读《Python bytes类型》一节做详细了解。
另外需要注意的一点是,想使用 read() 函数成功读取文件内容,除了严格遵守 read() 的语法外,其还要求 open() 函数必须以可读默认(包括 r、r+、rb、rb+)打开文件。举个例子,将上面程序中 open()的打开模式改为 w,程序会抛出
io.UnsupportedOperation
异常,提示文件没有读取权限:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\file.py", line 3, in <module>
print(f.read())
io.UnsupportedOperation: not readable
read()函数抛出UnicodeDecodeError异常的解决方法
在使用 read() 函数时,如果 Python 解释器提示UnicodeDecodeError
异常,其原因在于,目标文件使用的编码格式和 open() 函数打开该文件时使用的编码格式不匹配。举个例子,如果目标文件的编码格式为 GBK 编码,而我们在使用 open() 函数并以文本模式打开该文件时,手动指定 encoding 参数为 UTF-8。这种情况下,由于编码格式不匹配,当我们使用 read() 函数读取目标文件中的数据时,Python 解释器就会提示
UnicodeDecodeError
异常。要解决这个问题,要么将 open() 函数中的 encoding 参数值修改为和目标文件相同的编码格式,要么重新生成目标文件(即将该文件的编码格式改为和 open() 函数中的 encoding 参数相同)。
除此之外,还有一种方法:先使用二进制模式读取文件,然后调用 bytes 的 decode() 方法,使用目标文件的编码格式,将读取到的字节串转换成认识的字符串。
举个例子:
#以二进制形式打开指定文件,该文件编码格式为 utf-8 f = open("my_file.txt",'rb+') byt = f.read() print(byt) print("\n转换后:") print(byt.decode('utf-8')) #关闭文件 f.close()程序执行结果为:
b'Python\xe6\x95\x99\xe7\xa8\x8b\r\nhttps://www.xinbaoku.com/python/'
转换后:
Python教程
https://www.xinbaoku.com/python/
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算