为什么我不能在write()中为换行使用字符串,但在writelines()中可以使用它?
想法如下:如果你想写一个字符串,你可以用write()来完成。如果有一个字符串序列,可以使用writelines()将它们全部写入。
write(arg)需要一个字符串作为参数并将其写入文件。如果提供字符串列表,它将引发异常(顺便说一下,向我们显示错误!)。
writelines(arg)需要一个iterable作为参数(iterable对象可以是元组、列表、字符串或最一般意义上的迭代器)。迭代器中包含的每个项都应该是一个字符串。你提供的是一组字符串,所以一切正常。
字符串的性质对这两个函数都不重要,也就是说,它们只是将您提供的任何内容写入文件。有趣的是writelines()本身不添加换行符,因此方法名实际上可能相当混乱。它的行为实际上类似于一个名为write_all_of_these_strings(sequence)的虚方法。
下面是Python中的一种惯用方法,它将字符串列表写入文件,同时将每个字符串保持在自己的行中:lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
这会帮你关闭文件。构造'\n'.join(lines)连接(连接)列表中的字符串lines,并使用字符'\n'作为粘合剂。它比使用+运算符更有效。
从相同的lines序列开始,以相同的输出结束,但使用writelines():lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
这将使用生成器表达式并动态创建以换行符结尾的字符串。writelines()遍历这个字符串序列并写入每个项。
编辑:您应该注意的另一点:
在介绍writelines()之前就存在write()和readlines()。writelines()后来作为readlines()的对应项引入,这样就可以轻松地编写通过readlines()读取的文件内容:outfile.writelines(infile.readlines())
实际上,这是writelines有这么一个令人困惑的名字的主要原因。而且,今天,我们真的不想再使用这种方法了。readlines()在writelines()开始写入数据之前,将整个文件读取到计算机的内存中。首先,这可能会浪费时间。为什么不在读取其他部分的同时开始写入部分数据呢?但是,最重要的是,这种方法会消耗大量的内存。在一个极端的场景中,当输入文件大于机器的内存时,这种方法甚至不起作用。解决这个问题的方法是只使用迭代器。一个有效的例子:with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
这将逐行读取输入文件。一旦读取一行,该行就被写入输出文件。从原理上讲,内存中始终只有一行(在readlines/writelines方法中,与内存中的整个文件内容相比)。