为什么我不能在 write() 中使用字符串作为换行符,但我可以在 writelines() 中使用它?
想法如下:如果您想编写单个字符串,您可以使用write() 来执行此操作。如果您有一系列字符串,您可以使用writelines() 将它们全部写入。
write(arg) 需要一个字符串作为参数并将其写入文件。如果您提供字符串列表,它将引发异常(顺便向我们显示错误!)。
writelines(arg) 需要一个可迭代对象作为参数(可迭代对象可以是元组、列表、字符串或最一般意义上的迭代器)。迭代器中包含的每个项目都应该是一个字符串。您提供了一个字符串元组,所以一切正常。
字符串的性质对这两个函数都无关紧要,即它们只是将您提供的任何内容写入文件。有趣的部分是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() 遍历这个字符串序列并写入每一项。
编辑:您应该注意的另一点:
write() 和 readlines() 在引入 writelines() 之前就已经存在。 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 方法的情况下整个文件内容都在内存中)。