Python – write()与writelines()和连接的string

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

我想出了:

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

如果我尝试做:

 textdoc.write(lines) 

我得到一个错误。 但是如果我input:

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

然后它工作正常。 为什么我不能在write()中使用换行符的string,但是我可以在writelines()使用它?

Python 2.7当我search到谷歌search到的大部分资源时,我发现它们远远超过了我的头脑,我仍然是一个外行人。

writelines需要一个string列表,而write需要一个string。

line1 + "\n" + line2将这些string合并成单个string,然后line1 + "\n" + line2递给它。

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

为什么我不能在write()中使用换行符的string,但是我可以在writelines()中使用它?

这个想法是这样的:如果你想写一个string,你可以用write() 。 如果你有一串string,你可以使用writelines()写所有的string。

write(arg)需要一个string作为参数并将其写入文件。 如果你提供了一个string列表,它会引发一个exception(顺便说一下,给我们显示错误!)。

writelines(arg)需要一个可迭代的参数(一个可迭代的对象可以是一个元组,一个列表,一个string,或者是一般意义上的迭代器)。 包含在迭代器中的每个项目都应该是一个string。 一串string是你提供的,所以事情的工作。

string的性质与两个函数无关,也就是说,只要向您提供的文件写入文件即可。 有趣的部分是, writelines()不会自行添加换行符,所以方法名实际上可能相当混乱。 它实际上就像一个名为write_all_of_these_strings(sequence)的虚构方法。

接下来是Python中一种惯用的方法,它将string列表写入文件,同时保持每个string在一行中:

 lines = ['line1', 'line2'] with open('filename.txt', 'w') as f: f.write('\n'.join(lines)) 

这照顾为你closures文件。 构造'\n'.join(lines)连接(连接)列表lines的string,并使用字符'\ n'作为粘合剂。 这比使用+运算符更高效。

从相同的lines序列开始,以相同的输出结束,但使用writelines()

 lines = ['line1', 'line2'] with open('filename.txt', 'w') as f: f.writelines("%s\n" % l for l in lines) 

这使用生成器expression式并dynamic地创build换行符终止的string。 writelines()遍历这个string序列并写入每个项目。

编辑:另一点你应该知道的:

write()readlines()存在于writelines()之前。 writelines()稍后作为readlines()一个对象引入,以便人们可以轻松地写出刚刚通过readlines()读取的文件内容:

 outfile.writelines(infile.readlines()) 

实际上,这是writelines有这么一个令人困惑的名字的主要原因。 另外,今天,我们并不想再使用这种方法。 readlines()writelines()开始写入数据之前将整个文件读取到机器的内存中。 首先,这可能会浪费时间。 为什么不在阅读其他部分时开始写部分数据呢? 但是,最重要的是,这种方法可能非常耗费内存。 在input文件大于机器内存的极端情况下,这种方法甚至无法工作。 解决这个问题的方法是只使用迭代器。 一个工作的例子:

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

这将逐行读取input文件。 只要一行被读取,这行就被写入输出文件。 从图解上讲,内存中只有一行(与读/写方法中的整个文件内容相比)。

其实我觉得问题在于你的变数“线”不好。 你将行定义为一个元组,但是我相信write()需要一个string。 所有你必须改变是你的逗号分成加号(+)。

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

应该pipe用。

如果你只是想保存和加载列表尝试泡菜

保存腌菜:

 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()