Python read函数按字节(字符)读取文件的实现

 更新时间:2019年07月03日 11:25:02   作者:biancheng  
这篇文章主要介绍了Python read函数按字节(字符)读取文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

文件对象提供了 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将社交网络进行可视化

    这篇文章介绍了利用Python将社交网络进行可视化,主要是一些Python的第三方库来进行社交网络的可视化,利用领英(Linkedin)的社交关系数据展开介绍,内容可当学习练习题有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Python实现的旋转数组功能算法示例

    Python实现的旋转数组功能算法示例

    这篇文章主要介绍了Python实现的旋转数组功能算法,结合实例形式总结分析了数组旋转算法的原理与实现技巧,需要的朋友可以参考下
    2019-02-02
  • Django如何实现RBAC权限管理

    Django如何实现RBAC权限管理

    这篇文章主要介绍了Django如何实现RBAC权限管理问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Python多线程的退出控制实现

    Python多线程的退出控制实现

    这篇文章主要介绍了Python多线程的退出控制实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python通过UDP传输超过64k的信息

    Python通过UDP传输超过64k的信息

    在UDP中,单个数据包的最大尺寸通常受到网络层的限制,这通常被称为最大传输单元(MTU),在以太网环境中,标准的MTU大小通常为1500字节,下面是一个Python示例,展示了如何通过UDP发送和接收超过64KB的数据,需要的朋友可以参考下
    2024-08-08
  • flask中的wtforms使用方法

    flask中的wtforms使用方法

    这篇文章主要介绍了flask中的wtforms使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 解决Python报错:SyntaxError: invalid character ‘,‘ (U+FF0C)

    解决Python报错:SyntaxError: invalid character ‘,‘ (U+FF0C)

    Python中的 SyntaxError错误是Python语言中常见的异常错误类型之一,表示语法错误,下面这篇文章主要给大家介绍了关于解决Python报错:SyntaxError: invalid character ‘,‘ (U+FF0C)的相关资料,需要的朋友可以参考下
    2022-12-12
  • 为什么说python更适合树莓派编程

    为什么说python更适合树莓派编程

    在本篇文章里小编给大家整理的是关于为什么说python更适合树莓派编程的相关文章,需要的朋友们可以参考学习下。
    2020-07-07
  • Python 生成一个从0到n个数字的列表4种方法小结

    Python 生成一个从0到n个数字的列表4种方法小结

    今天小编就为大家分享一篇Python 生成一个从0到n个数字的列表4种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python使用pymysql模块操作MySQL

    python使用pymysql模块操作MySQL

    本文讲述了python操作mysql基础实例展示,包含pymysql的使用,tkinter的使用,感兴趣的朋友可以参考下
    2021-06-06

最新评论