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 httplib模块使用实例
Apr 11 Python
Python映射拆分操作符用法实例
May 19 Python
Python面向对象类的继承实例详解
Jun 27 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
基于Python的PIL库学习详解
May 10 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
基于python-opencv3的图像显示和保存操作
Jun 27 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
django从后台返回html代码的实例
Mar 11 Python
学习python需要有编程基础吗
Jun 02 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 htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
工程合作意向书范本
2015/05/09 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
化工厂员工工作总结
2015/10/15 职场文书
导游词之上海豫园
2019/10/24 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python