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代码
Mar 13 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
python下载微信公众号相关文章
Feb 26 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
python实现ping命令小程序
Dec 28 Python
Python爬虫回测股票的实例讲解
Jan 22 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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 中的str_replace 函数总结
2007/04/27 PHP
cmd下运行php脚本
2008/11/25 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python根据日期返回星期几的方法
2015/07/06 Python
python实现简易版计算器
2020/06/22 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
职业生涯规划设计步骤
2014/01/12 职场文书
学生请假条
2014/04/11 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
考研英语复习计划
2015/01/19 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
班主任开场白
2015/06/01 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
python基础之类属性和实例属性
2021/10/24 Python