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实现的简单算术游戏实例
May 26 Python
Python变量作用范围实例分析
Jul 07 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
python实现用户管理系统
Jan 10 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 Python
Python用input输入列表的实例代码
Feb 07 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python3.5的包存放的具体路径
Aug 16 Python
基于Python爬取股票数据过程详解
Oct 21 Python
Python实现拼音转换
Jun 07 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乱码问题
2012/03/25 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
php实现图片压缩处理
2020/09/09 PHP
理解Javascript闭包
2013/11/01 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
最受欢迎的自我评价
2013/12/22 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
运动会拉拉队口号
2014/06/09 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
2015年端午节活动方案
2015/05/05 职场文书
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS