提到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自带的记事本当文本很大时,便会读取很慢,所以可否添加一个打开方式,使文本打开用只读取适当大小内容打开,读者可以一边看一边在读取新的内容。