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合并文本文件示例
Feb 07 Python
python 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
Python实现从url中提取域名的几种方法
Sep 26 Python
wxPython框架类和面板类的使用实例
Sep 28 Python
Flask解决跨域的问题示例代码
Feb 12 Python
python对离散变量的one-hot编码方法
Jul 11 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
pycharm导入源码的具体步骤
Aug 04 Python
python爬取音频下载的示例代码
Oct 19 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 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
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
thinkPHP查询方式小结
2016/01/09 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
荷兰手表网站:Watch2Day
2018/07/02 全球购物
中学生家长评语大全
2014/04/16 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
中华魂演讲稿
2014/05/13 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
团日活动总结怎么写
2014/06/25 职场文书
个人简历求职信范文
2015/03/20 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript