文件对象提供了 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 错误。

如果要读取的文件所使用的字符集和当前操作系统的字符集不匹配,则有两种解决方式:

使用二进制模式读取,然后用 bytes 的 decode() 方法恢复成字符串。

利用 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 read函数按字节(字符)读取文件的实现相关推荐

  1. python 字符串输入时间_Python input()函数:获取用户输入的字符串

    input() 函数用于向用户生成一条提示,然后获取用户输入的内容.由于 input() 函数总会将用户输入的内容放入字符串中,因此用户可以输入任何内容,input() 函数总是返回一个字符串. 例如 ...

  2. python画pr曲线_python 画函数曲线示例

    python 画函数曲线示例 如下所示: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi ...

  3. python里apply用法_Python apply函数的用法

    Python apply函数的用法 发布于 2014-08-07 21:02:24 | 674 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计 ...

  4. python安装os模块_python的os模块(ipython,文件,目录,权限,管理)

    什么是os模块 os模块提供了多数操作系统的功能接口函数.当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件.目录打交道,这时就离不了o ...

  5. python导入模块快捷键_Python中的模块导入和读取键盘输入的方法

    导入模块 import 语句 想使用Python源文件,只需在另一个源文件里执行import语句,语法如下: ? 当解释器遇到import语句,如果模块在当前的搜索路径就会被导入. 搜索路径是一个解释 ...

  6. python内置函数调用_Python中函数的基本定义与调用及内置函数详解

    前言 函数function是python编程核心内容之一,也是比较重要的一块.首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有 ...

  7. python 内部函数传参_python中函数传参详解

    一.参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple: 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict: 1. 传入可变参数: def ca ...

  8. python返回变量类型_Python指定函数参数、返回值类型报错是咋了?

    Leetcode刷题给的默认函数格式是这样的: Class Solution: def coinChange(self, coins: List[int], amount: int) -> in ...

  9. python函数调用自身后果_python 写函数在一定条件下需要调用自身时的写法说明...

    例如以下这个函数:state = 1 def set_state(state): while state: set = int(input('请输入9或5,显示"hello world&qu ...

最新文章

  1. c++备忘录模式mememto
  2. 获取URL中 后面的参数值
  3. 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
  4. 源码分析参考:Scheduler
  5. 7.QT-Qt对象间的父子关系
  6. lammps教程:ovito多晶显示方法
  7. QT的triggered意思
  8. 4G边缘计算工业路由器与传统4G工业路由器的区别
  9. 企业如何做软文营销推广?
  10. 全球与中国同心管换热器市场市场需求动态及十四五前景展望研究报告2022~2028年
  11. 多线程,io,网编,反射,xml
  12. SQL数据库修复教程-浪潮GS7.0中了后缀是.5ss5c勒索病毒修复过程
  13. 高等代数 多项式环(第7章)3 一元多项式的根与不可约多项式
  14. 如何获得凤凰网或腾讯视频链接并下载到本地
  15. Tue Sep 03 2019 00:00:00 GMT+0800 (中国标准时间)怎么变成时间戳
  16. 12月22总结--生活要稳住
  17. virtualbox拷贝文件夹 linux,VirtualBox下快速创建新的虚拟机——复制vdi文件
  18. 目前中国互联网现状和UI设计行业现状分析!
  19. python SQLAlchemy数据库工具
  20. 拟合线性回归模型_R

热门文章

  1. 如何自定义SAP Spartacus店铺的界面颜色风格
  2. Hybris Storefront里产品图片显示不出来的分析方法
  3. why process type for MyOpportunity creation is empty
  4. SAP OData:MPC class get last modified - how to implement
  5. Changing scope values asynchronously - updates don't propagate without .apply()
  6. 利用memory comparison分析一个时间段内的内存占用率
  7. OrderAnalyticsController.initializeCachedDB - jdbc
  8. initializeCachedDB function in JavaScript - how is the call delegated to
  9. Service Team在索引表CRMD_ORDER_INDEX中的存储设计
  10. One question regarding your note Note 1731777 - Debugging background work items