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解析xml模块封装代码
Feb 07 Python
python daemon守护进程实现
Aug 27 Python
python实现决策树
Dec 21 Python
Django 连接sql server数据库的方法
Jun 30 Python
Pandas中resample方法详解
Jul 02 Python
Pytorch中.new()的作用详解
Feb 18 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
python实现人机五子棋
Mar 25 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
python绘制分布折线图的示例
Sep 24 Python
python实现腾讯滑块验证码识别
Apr 27 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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入门基础之php代码写法
2011/12/30 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python中字符串的处理技巧分享
2016/09/17 Python
详解django中自定义标签和过滤器
2017/07/03 Python
python验证码识别的示例代码
2017/09/21 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
django 模型中的计算字段实例
2020/05/19 Python
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
自强之星事迹材料
2014/05/12 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
Python学习开发之图形用户界面详解
2021/08/23 Python