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