python的readall函数_Pythonread函数按字节(字符)读取⽂
件的实现
⽂件对象提供了 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 ("",'r',True)
try:
python怎么读取py文件while true:
#每次读取⼀个字符
ch = f.read(1)
#如果没有读取到数据,则跳出循环
if not ch:break
#输出ch
print(ch, end='')
finally:
f.close()
本章为了突出主题,简化程序,都将直接调⽤ close() ⽅法关闭⽂件,避免使⽤ finally 块。
如果在调⽤ read() ⽅法时不传⼊参数,该⽅法默认会读取全部⽂件内容。例如如下程序:
f = open("", 'r', True)
# 直接读取全部⽂件
ad())
f.close()
通过上⾯两个程序,读者可能已经发现了⼀个问题,当使⽤ open() 函数打开⽂本⽂件时,程序使⽤的是哪种字符集呢?总是使⽤当前操作系统的字符集,⽐如 Windows 平台,open() 函数总是使⽤ GBK 字符集。因此,上⾯程序读取的 也必须使⽤ GBK 字符集保存;否则,程序就会出现 UnicodeDecodeError 错误。
如果要读取的⽂件所使⽤的字符集和当前操作系统的字符集不匹配,则有两种解决⽅式:
使⽤⼆进制模式读取,然后⽤ bytes 的 decode() ⽅法恢复成字符串。
利⽤ codecs 模块的 open() 函数来打开⽂件,该函数在打开⽂件时允许指定字符集。
下⾯程序使⽤⼆进制模式来读取⽂本⽂件:
# 指定使⽤⼆进制⽅式读取⽂件内容
f = open("read_test3.py", 'rb', True)
# 直接读取全部⽂件,并调⽤bytes的decode将字节内容恢复成字符串
ad().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 字符集,这样程序在读取⽂件内容时就完全没有问题了。
时间: 2019-07-01
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论