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微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
python爬虫爬取网页表格数据
Mar 07 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
详解python pandas 分组统计的方法
Jul 30 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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 PDO函数库详解
2010/04/27 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
初识ThinkPHP控制器
2016/04/07 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
关于Django Models CharField 参数说明
2020/03/31 Python
深入浅析Python代码规范性检测
2020/07/31 Python
python ssh 执行shell命令的示例
2020/09/29 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
求职信写作要突出重点
2014/01/01 职场文书
黄河的主人教学反思
2014/02/07 职场文书
优秀团支部事迹材料
2014/02/08 职场文书
抽奖活动主持词
2014/03/31 职场文书
爱祖国演讲稿
2014/05/04 职场文书
食品安全处置方案
2014/06/14 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
千手观音观后感
2015/06/03 职场文书