Python read函数按字节(字符)读取文件的实现


Posted in Python onJuly 03, 2019

文件对象提供了 read() 方法来按字节或字符读取文件内容,到底是读取宇节还是字符,则取决于是否使用了 b 模式,如果使用了 b 模式,则每次读取一个字节;如果没有使用 b 模式,则每次读取一个字符。在调用该方法时可传入一个整数作为参数,用于指定最多读取多少个字节或宇符。

例如,如下程序采用循环读取整个文件的内容:

f = open("read_test.py", 'r', True)
while True:
  # 每次读取一个字符
  ch = f.read(1)
  # 如果没有读到数据,跳出循环
  if not ch: break
  # 输出ch
  print(ch, end='')
f.close()

上面程序采用循环依次读取每一个字符(因为程序没有使用 b 模式),每读取到一个字符,程序就输出该字符。

正如从上面程序所看到的,当程序读写完文件之后,推荐立即调用 close() 方法来关闭文件,这样可以避免资源泄露。如果需要更安全地关闭文件,推荐将关闭文件的 close() 方法调用在 finally 块中执行。例如,将上面程序改为如下形式:

f =open ("test.txt",'r',True)
try:
  while true:
    #每次读取一个字符
    ch = f.read(1)
    #如果没有读取到数据,则跳出循环
    if not ch:break
    #输出ch
    print(ch, end='')
  finally:
    f.close()

本章为了突出主题,简化程序,都将直接调用 close() 方法关闭文件,避免使用 finally 块。

如果在调用 read() 方法时不传入参数,该方法默认会读取全部文件内容。例如如下程序:

f = open("test.txt", 'r', True)
# 直接读取全部文件
print(f.read())
f.close()

通过上面两个程序,读者可能已经发现了一个问题,当使用 open() 函数打开文本文件时,程序使用的是哪种字符集呢?总是使用当前操作系统的字符集,比如 Windows 平台,open() 函数总是使用 GBK 字符集。因此,上面程序读取的 test.txt 也必须使用 GBK 字符集保存;否则,程序就会出现 UnicodeDecodeError 错误。

如果要读取的文件所使用的字符集和当前操作系统的字符集不匹配,则有两种解决方式:

  1. 使用二进制模式读取,然后用 bytes 的 decode() 方法恢复成字符串。
  2. 利用 codecs 模块的 open() 函数来打开文件,该函数在打开文件时允许指定字符集。

下面程序使用二进制模式来读取文本文件:

# 指定使用二进制方式读取文件内容
f = open("read_test3.py", 'rb', True)
# 直接读取全部文件,并调用bytes的decode将字节内容恢复成字符串
print(f.read().decode('utf-8'))
f.close()

上面程序在调用 open() 函数时,传入了 rb 模式,这表明采用二进制模式读取文件,此时文件对象的 read() 方法返回的是 bytes 对象,程序可调用 bytes 对象的 decode() 方法将它恢复成字符串。由于此时读取的 read_test3.py 文件是以 UTF-8 的格式保存的,因此程序需要使用 decode() 方法恢复字符串时显式指定使用 UTF-8 字符集。

下面程序使用 codes 模块的 open() 函数来打开文件,此时可以显式指定字符集:

import codecs
#指定使用utf-8 字符集读取文件内容
f = codecs.open("read_test4.py", 'r', 'utf-8', buffering=True)
while True:
  #每次读取一个字符
  ch = f.read(1)
  #如果没有读取到数据,则跳出循环
  if not ch : break
  #输出ch
  print (ch, end='')
f.close()

上面程序在调用 open() 函数时显式指定使用 UTF-8 字符集,这样程序在读取文件内容时就完全没有问题了。

Python 相关文章推荐
python 回调函数和回调方法的实现分析
Mar 23 Python
Python之批量创建文件的实例讲解
May 10 Python
Python反射和内置方法重写操作详解
Aug 27 Python
使用tensorflow实现线性svm
Sep 07 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
利用python求积分的实例
Jul 03 Python
Golang GBK转UTF-8的例子
Aug 26 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
python excel多行合并的方法
Dec 09 Python
Python中npy和mat文件的保存与读取
Apr 24 Python
在Python中COM口的调用方法
Jul 03 #Python
python字符串中匹配数字的正则表达式
Jul 03 #Python
python二进制文件的转译详解
Jul 03 #Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 #Python
深入浅析python3中的unicode和bytes问题
Jul 03 #Python
10款最好的Python开发编辑器
Jul 03 #Python
python基于递归解决背包问题详解
Jul 03 #Python
You might like
PHP 变量的定义方法
2010/01/26 PHP
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
javascript 中的 delete及delete运算符
2015/11/15 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
p5.js临摹旋转爱心
2019/10/23 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
详解Python中with语句的用法
2015/04/15 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
高中学生期末评语
2014/04/25 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
逃课检讨书
2015/01/26 职场文书
自书遗嘱范文
2015/08/07 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android