“readline”,“readlines”,“writeline”和“writelines”这些功能需要将文件对象“f”以文本模式而非二进制模式打开吗?

3
file对象f拥有以下IO方法,来自Python in a Nutshell:

f.read(size=-1)

在v2或者v3中当f以二进制模式打开时,read会最多读取size字节的数据并以一个bytes字符串的形式返回。如果在读取size字节之前文件已经结束,read将只读取和返回少于size字节的数据。当size小于0时,read会一直读取直到读完整个文件,并返回所有的数据。 当文件当前位置已经到达文件结尾或者size等于0时,read返回空字符串。在v3中当f以文本模式打开时,size表示字符数而不是字节数,read会返回一个文本字符串。

f.readline(size=-1)

从f的文件中读取并返回一行,包括行末的\n。如果size大于等于0,则readline最多只读取size个字节。在这种情况下,返回的字符串可能不以\n结尾。当readline读取到文件末尾却没有找到\n时,\n也可能不存在。当文件当前位置已经到达文件结尾或者size等于0时,readline返回空字符串。

f.readlines(size=-1)

从f的文件中读取并返回包含每一行数据的字符串列表,每个字符串都以\n结尾。如果size>0, readlines在读取数据达到约定的size字节时停止读取,并在此时返回列表,最后一个字符串可能不以\n结尾。

readlinereadlines要求file对象f以文本模式而不是二进制模式打开。
同样的问题也适用于writelinewritelines

没有 writeline。一个人应该显式地添加 \n(就像使用 writelines 一样)。 - Michel de Ruiter
1个回答

1
不,它们也可以在二进制模式下工作,以b'\n'为分隔符,返回一个bytes对象列表。
尝试使用Python 3.5.2,得到以下输出:
[14:52:44]adamer8:~ ()$ cat Sample.txt
country
code
bold
hello
yellow
country
code
bold
country
[14:52:48]adamer8:~ ()$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('Sample.txt','rb')
>>> content = f.readlines()
>>> print(content)
[b'country\n', b'code\n', b'bold\n', b'hello\n', b'yellow\n', b'country\n', b'code\n', b'bold\n', b'country\n']
>>> type(content[0])
<class 'bytes'>
>>> 

当使用模式“r”打开文件时,我们会得到字符串:
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('Sample.txt','r')
>>> content = f.readlines()
>>> print(content)
['country\n', 'code\n', 'bold\n', 'hello\n', 'yellow\n', 'country\n', 'code\n', 'bold\n', 'country\n']
>>> type(content[0])
<class 'str'>
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接