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实现文件路径和url相互转换的方法
Jul 06 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
python实现七段数码管和倒计时效果
Nov 23 Python
django配置app中的静态文件步骤
Mar 27 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
Python常用数字处理基本操作汇总
Sep 10 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
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
优化Python代码使其加快作用域内的查找
2015/03/30 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
django富文本编辑器的实现示例
2019/04/10 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
《她是我的朋友》教学反思
2014/04/26 职场文书
学校社会实践活动总结
2014/07/03 职场文书
校园安全广播稿范文
2014/09/25 职场文书
毕业设计论文评语
2014/12/31 职场文书
出纳岗位职责
2015/01/31 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
Python答题卡识别并给出分数的实现代码
2021/06/22 Python