Python read()函数:按字节(字符)读取文件

前一节中,介绍了如何通过 open() 函数打开一个文件。在其基础上,本节继续讲解如何读取已打开文件中的数据。

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 的文本文件,其内容为:

张三
zhangsan

然后在和 my_file.txt 同目录下,创建一个 file.py 文件,并编写如下语句:

#以 utf-8 的编码格式打开指定文件
f = open("my_file.txt",encoding = "utf-8")
#输出读取到的数据
print(f.read())
#关闭文件
f.close()

程序执行结果为:

张三
zhangsan

注意,当操作文件结束后,必须调用 close() 函数手动将打开的文件进行关闭,这样可以避免程序发生不必要的错误。

当然,我们也可以通过使用 size 参数,指定 read() 每次可读取的最大字符(或者字节)数,例如:

#以 utf-8 的编码格式打开指定文件
f = open("my_file.txt",encoding = "utf-8")
#输出读取到的数据
print(f.read(2))
#关闭文件
f.close()

程序执行结果为:

张三

显然,该程序中的 read() 函数只读取了 my_file 文件开头的2 个字符。

再次强调,size 表示的是一次最多可读取的字符(或字节)数,因此,即便设置的 size 大于文件中存储的字符(字节)数,read() 函数也不会报错,它只会读取文件中所有的数据。

除此之外,对于以二进制格式打开的文件,read() 函数会逐个字节读取文件中的内容。例如:

#以二进制形式打开指定文件
f = open("my_file.txt",'rb+')
#输出读取到的数据
print(f.read())
#关闭文件
f.close()

程序执行结果为:
b’张三\xe6\x95\x99\xe7\xa8\x8b\r\nzhangsan’

可以看到,输出的数据为 bytes 字节串。我们可以调用 decode() 方法,将其转换成我们认识的字符串。

另外需要注意的一点是,想使用 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'张三\xe6\x95\x99\xe7\xa8\x8b\r\nzhangsan'

转换后:

张三
zhangsan

Python read()函数:按字节(字符)读取文件相关推荐

  1. python按字节读取_Python read函数按字节(字符)读取文件的实现

    文件对象提供了 read() 方法来按字节或字符读取文件内容,到底是读取宇节还是字符,则取决于是否使用了 b 模式,如果使用了 b 模式,则每次读取一个字节:如果没有使用 b 模式,则每次读取一个字符 ...

  2. Python readline()和readlines()函数:按行读取文件

    Python readline()和readlines()函数:按行读取文件 前面章节中讲到,如果想读取用 open() 函数打开的文件中的内容,除了可以使用 read() 函数,还可以使用 read ...

  3. c int转字符串_【C++实现python字符串函数库】字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  4. python读取一行的函数_Python linecache.getline()读取文件中特定一行的脚本

    Python linecache.getline()读取文件中特定一行的脚本 比如: Code highlighting produced by Actipro CodeHighlighter (fr ...

  5. 让python飞:形象理解python os模块、内存硬盘、字节字符、文件读写复制

    Day08葫芦娃救爷爷 葫芦娃去救爷爷,在洞口遇到了一个小机器人.它对葫芦娃说,它是这个洞的管家(os模块管理目录和文件),并告诉葫芦娃这个洞的名字叫温豆思洞,简称牛头洞(# print(os.nam ...

  6. python中readlines函数用法_Python readline和readlines函数:按行读取文件

    如果程序要读取行,通常只能用文本方式来读取,道理很简单,只有文本文件才有行的概念,二进制文件没有所谓行的概念. 文件对象提供了如下两个方法来读取行: readline([n]):读取一行内容.如果指定 ...

  7. python文本文件不能用二进制文件方式读入_如何使用python函数以二进制形式读取文件?...

    虽然读取文件的方式各种各样,但是通过二进制,还是头一次,实现过过程并不难,我们需要将文件先做好封存,以函数的形式,保存下来,然后直接导入进行使用,这样就可以读取文件,因为直接二进制读取是不现实的,只能 ...

  8. php 文件保存函数,php 写入和读取文件函数

    //读取文件函数 function readfromfile($file_name) { if (file_exists($file_name)) { $filenum=fopen($file_nam ...

  9. Day21-IO流字节字符读取

    1.字节流(输入输出流) package com._01知识回顾;import java.io.*; // 字节输出流try-with-resources会自动关闭调用close(); public ...

  10. Python常用函数:csv【CSV文件的读取、写入】

    csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换.Excel文件和数据库数据的导入和导出. 与Excel 文件不同,CSV 文件中: 值没有类型,所有值都是字 ...

最新文章

  1. torch学习笔记(二) nn类结构-Linear
  2. 欲精一行,必先通十行
  3. return 返回部分值
  4. 开源 免费使用 打包下载自行部署 :升讯威 周报系统
  5. Veebot-自动静脉抽血机器人
  6. Jsoup代码解读之四-parser(上)
  7. iOS学习 NSString常用技巧
  8. 如何在UE4中创建线程
  9. springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题
  10. 桶排序Bucket sort(转)
  11. ## CSP 201409-1相邻数对(C语言)(100分)
  12. BZOJ 5319: [Jsoi2018]军训列队(可持久化线段树)
  13. 爬虫—分析Ajax爬取今日头条图片
  14. ICEM(2)—机翼翼稍网格绘制
  15. struts2通配符的使用
  16. 计算机符号链接是什么意思,Windows或Linux上的符号链接(符号链接)完整指南
  17. MindManager 2020(Keymaker-CORE.rar)新手学习安装下载中文版及教程
  18. 关于BeanUtils.populate
  19. 计算机平均值的快捷键,excel求平均值快捷键
  20. 企业信用代码等常用的正则验证

热门文章

  1. 数据相关的在职研究生_读金融在职研究生有用吗?
  2. 天翼对讲3.0新平台发布 三大优势引领公网对讲新生态
  3. html旋转的等到的圆圈,CSS3 Loading 旋转圆盘加载动画
  4. TensorFlow 模型保存/载入的两种方法
  5. 如何培养出高素质的大数据人才(一)
  6. mysql 安装 my.cnf配置错误_MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法...
  7. 防近视产品区分LED防蓝光原理
  8. 基于MFCC对GTZAN音乐流派分类
  9. 苹果手机声音突然变小是怎么回事_手机电话音量突然变小什么是原因?是手机出问题了吗...
  10. 黑龙江高中计算机结业水平测试,黑龙江省普通高中学业水平考试