先看是什么,再看怎么用。着急的话,可以看最后的一节。

开始前,先介绍一个小技巧:内置函数 repr(英文名representation)。开发调试用的,返回一个对象的字符串表示形式,包含对象的类型。
(函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式。)
举例:

    my_str = '你好\n'
    print(my_str.__str__())
    print(my_str.__repr__())

结果:

你好

'你好\n'

str 函数直接将‘\n’转义的结果打印了,看不到’\n’了,而 repr 函数的打印结果保留了字符串原始的样子,而且可以看出打印的是一个字符串类型。

接下来,我们也用 repr 这个函数来看看 read 函数的结果。为方便解释,我们的代码示例每次都读取整个文件。

文件内容:
python的 read, readlines,readline 有何异同,读取文件的时候用哪个好?怎么选择。-LMLPHP

read

with open('running.log', 'r') as f:
    content = f.read()    
print(content)   
print(content.__repr__())

运行结果:
python的 read, readlines,readline 有何异同,读取文件的时候用哪个好?怎么选择。-LMLPHP
一般的print打印可以看到文件完整内容,而 read的结果上实际上是一个字符串,包含有文件每行的换行符’\n’,第2行开头的空格也会保留下来。

简单来说,read 函数就是将文件从头到尾一字不落地读取到一个字符串中。

readlines

with open('running.log', 'r') as f:
    content = f.readlines()
print(content.__repr__())

运行结果:
python的 read, readlines,readline 有何异同,读取文件的时候用哪个好?怎么选择。-LMLPHP
显然,readlines 的结果是一个列表,每个元素就是文件一行的内容,同样也保留了空格。

简单来说,readlines 读取的也是整个文件一字不落的内容,只是按行存放在了列表中。方便按行取用。

readline

with open('running.log', 'r') as f:
    print(f.readline().__repr__())

运行结果:
python的 read, readlines,readline 有何异同,读取文件的时候用哪个好?怎么选择。-LMLPHP
readline 一次调用只能读取一行,不能完整读取文件。

从名字就可以看出来,readline 就是 readlines 函数的子过程。

简单来说,就是读取文件的一行。
如果要完整读取,可以这样写:

with open('running.log', 'r') as f:
    for line in f:
        print(line.__repr__())

运行结果:
python的 read, readlines,readline 有何异同,读取文件的时候用哪个好?怎么选择。-LMLPHP

怎么选择?:

本质上来说,三者并没有区别,都能够完整读取文件内容,包括末尾的’\n’的等换行符。

差别在于返回类型和调用形式。

read 返回字符串类型,如果你需要用正则去查找一些东西,字符串是更好的选择。

readlines 返回列表类型,如果你需要读取完文件然后挑几行处理,或者逐行处理,就用它。(在 python 中是更常用的,无脑用。)

readline 返回的是字符串类型,如果你需要在读取文件的过程中就进行处理判断,不需要读完整个文件,用这个函数就比较合适。

01-28 23:11