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 18 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
详解python字节码
Feb 07 Python
python+opencv识别图片中的圆形
Mar 25 Python
Python列表解析配合if else的方法
Jun 23 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
python字典排序的方法
Oct 12 Python
用Python画小女孩放风筝的示例
Nov 23 Python
python如何写出表白程序
Jun 01 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
pytorch Dropout过拟合的操作
May 27 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
一个用于网络的工具函数库
2006/10/09 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
js 省地市级联选择
2010/02/07 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
jQuery基础知识小结
2014/12/22 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python语言描述随机梯度下降法
2018/01/04 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
python实现Flappy Bird源码
2018/12/24 Python
浅析python的Lambda表达式
2019/02/27 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
儿媳婚宴答谢词
2014/01/14 职场文书
医学生个人求职信范文
2014/02/07 职场文书
大学军训感言1500字
2014/03/09 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
就业推荐表院系意见
2015/06/05 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
进行数据处理的6个 Python 代码块分享
2022/04/06 Python