为什么我不能在write()中将字符串用于换行符,但可以在writelines()中使用它?
想法如下:如果要编写单个字符串,可以使用write()
。如果您有一系列字符串,则可以使用编写所有字符串writelines()
。
write(arg)
需要一个字符串作为参数并将其写入文件。如果您提供字符串列表,它将引发异常(顺便说一下,向我们显示错误!)。
writelines(arg)
期望将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()
遍历此字符串序列并写入每个项目。
编辑:您应该注意的另一点:
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)
这将逐行读取输入文件。读取一行后,该行即被写入输出文件。从概念上讲,内存中始终只有一行(相比之下,在采用读取行/写入行方法的情况下,整个文件内容都在内存中)。
lines
在您的示例中不是字符串。它是由六个字符串组成的元组。