提到read() readline() readlines()这几个方法不免提一下open(),open()常用的参数有mode、errors、encoding。这里只说一下encoding,原因是有些困惑。如下
在默认情况下(encoding = None)(作者认为是Unicode)。现在进行如下操作(all.txt是一个utf-8编码的文本,里面是汉字)
f = open('../all.txt','r',errors = 'ignore')
a = f.read()
print(type(f))
print(type(a))
print(a)
f.close()
结果如下
<class '_io.TextIOWrapper'>
<class 'str'>
------------
绗涓鍗
如果将encoding设为utf-8即可打印出正常文本,解释如下unicode对汉字的编码一般是2个字节而utf-8一般为3个字节,这里我用error = ‘ignore’来忽视这种错误,故打印出乱码,倘若不加这个参数,程序便会报错。
这里可以经过isintance(f,Iterator)来判断,可推出f是迭代器可以用for来遍历,f中的数据流是字符流。这里就有一些矛盾,encoding在意思上应该是编码,即f中的数据流应该是bytes流而非字符,所以推断open函数有这样的功能。例如:
a = 'a'
print(a.encode('utf-8'))
结果如下
b'a'
请按任意键继续. . .
好如果理解这层意思下面看read(size)这其中的size是字节数还是字符数
f = open('../all.txt','r',encoding = 'utf-8')
a = f.read(100)
print(a)
f.close()
结果如下
(size=100)
------------
第一卷
------------
第一章 陨落的天才
第一章 陨落的天才(本章免费)
“斗之力,三段!”
望着测验魔石碑上面闪亮得
(size = 101)
------------
第一卷
------------
第一章 陨落的天才
第一章 陨落的天才(本章免费)
“斗之力,三段!”
望着测验魔石碑上面闪亮得甚
(size = 102)
------------
第一卷
------------
第一章 陨落的天才
第一章 陨落的天才(本章免费)
“斗之力,三段!”
望着测验魔石碑上面闪亮得甚至
如果上面看懂的话,结果不言而喻是字符数而非字节数。
哪为什么网上大多数会说是字节数呢,其实很简单当你的文本是用ASCII编码时字节数等于字符数所以如此,而我是因为读了汉字所以有误差,故试了试发现是字符数。
言归正传
read(size)当size不指定时,会将文件全部内容读取
readline()一次只读取一行即遇到‘\n’返回
readlines()读取整个文件,并返回列表,一行为一个元素
在这里想到一个问题windows自带的记事本当文本很大时,便会读取很慢,所以可否添加一个打开方式,使文本打开用只读取适当大小内容打开,读者可以一边看一边在读取新的内容。