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操作MySQL数据库的方法分享
May 29 Python
Python实现数据库编程方法详解
Jun 09 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
对python for 文件指定行读写操作详解
Dec 29 Python
pytorch索引查找 index_select的例子
Aug 18 Python
python编写猜数字小游戏
Oct 06 Python
python+mysql实现个人论文管理系统
Oct 25 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python基于socket函数实现端口扫描
May 28 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 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实现算式验证码和汉字验证码实例
2015/03/09 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
Python with用法实例
2015/04/14 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
深入了解python中元类的相关知识
2019/08/29 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python中有关时间日期格式转换问题
2019/12/25 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
python生成word合同的实例方法
2021/01/12 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
实习教师自我鉴定
2013/12/09 职场文书
竟聘演讲稿范文
2013/12/31 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫