Write()与 writeline()和连接的字符串

所以我在学 Python。我正在通过课程,遇到了一个问题,我不得不压缩了大量的 target.write()到一个单一的 write(),而有一个 "\n"之间的每个用户输入变量(对象的 write())。

我想到了:

nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)

如果我尝试这样做:

textdoc.write(lines)

我得到一个错误。但如果我输入:

textdoc.write(line1 + "\n" + line2 + ....)

那就没问题。为什么我不能在 write()中使用一个字符串作为换行符,但是我可以在 writelines()中使用它?

Python 2.7

373773 次浏览
  • writelines期望字符串的可迭代
  • write期望使用单个字符串。

在传递给 write之前,line1 + "\n" + line2将这些字符串合并为一个字符串。

注意,如果有许多行,可能需要使用 "\n".join(list_of_lines)

为什么我不能在 write ()中使用一个字符串作为换行符,但是我可以在 writeline ()中使用它?

这个想法是这样的: 如果你想写一个单一的字符串,你可以这样做与 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名称如此令人困惑的主要原因。而且,今天,我们真的不想再使用这种方法了。在 writelines()开始写入数据之前,readlines()将整个文件读取到计算机的内存中。首先,这可能会浪费时间。为什么不在读取其他部分的同时开始写入部分数据呢?但是,最重要的是,这种方法可能非常耗费内存。在一个极端的场景中,如果输入文件大于计算机的内存,这种方法甚至不起作用。这个问题的解决方案是只使用迭代器。一个实例:

with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)

这将逐行读取输入文件。只要读取一行,就会将该行写入输出文件。从示意图上看,内存中总是只有一行(与使用 readlines/writeline 方法时内存中的整个文件内容相比)。

事实上,我认为问题在于你的变量“ line”不好。您将行定义为元组,但我认为 write ()需要一个字符串。你只需要把逗号改成加号(+)。

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

应该可以。

如果您只想保存和加载列表,请尝试 腌黄瓜

泡菜保存:

with open("yourFile","wb")as file:
pickle.dump(YourList,file)

及载入:

with open("yourFile","rb")as file:
YourList=pickle.load(file)

Zed Shaw 书中的练习16? 你可以使用如下转义字符:

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()