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中用sleep()方法操作时间的教程
May 22 Python
详解使用Python处理文件目录的相关方法
Oct 16 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
python设计tcp数据包协议类的例子
Jul 23 Python
python 直接赋值和copy的区别详解
Aug 07 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
python_tkinter事件类型详情
Mar 20 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将数据导入到Foxmail的实现代码
2010/09/05 PHP
php过滤敏感词的示例
2014/03/31 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
javascript里的条件判断
2007/02/27 Javascript
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
推荐下python/ironpython:从入门到精通
2007/10/02 Python
Python解析最简单的验证码
2016/01/07 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
Weblogc domain问题
2014/01/27 面试题
作弊检讨书1000字
2014/02/01 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
运动会加油稿50字
2015/07/21 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
五年级语文教学反思
2016/03/03 职场文书