Python - write()与writelines()和连接字符串

所以我正在学习Python。 我正在经历课程并遇到一个问题,我必须将很多write()压缩成一个writelines(),同时在每个用户输入变量(write()的对象)之间有一个"\n"

我提出了:

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当我搜索google时,我发现的大部分资源都是我的头脑,我还是一个非专业人士。

AbeLinkon asked 2019-08-13T23:00:57Z
5个解决方案
113 votes
  • "\n".join(list_of_lines)需要一个可迭代的字符串
  • "\n".join(list_of_lines)需要一个字符串。

"\n".join(list_of_lines)将这些字符串合并为一个字符串,然后再将其传递给write

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

DGH answered 2019-08-13T23:01:33Z
105 votes

为什么我无法在write()中使用字符串作为换行符,但我可以在writelines()中使用它?

这个想法如下:如果你想写一个字符串,你可以用write()这样做。如果你有一个字符串序列,你可以使用readlines()全部写它们。

write()需要一个字符串作为参数并将其写入该文件。 如果您提供字符串列表,它将引发异常(顺便说一下,向我们显示错误!)。

期望迭代为参数(可迭代对象可以是最一般意义上的元组,列表,字符串或迭代器)。 迭代器中包含的每个项都应该是一个字符串。 你提供了一个字符串元组,所以事情有效。

字符串的性质对两个函数都无关紧要,即它们只是写入文件,无论你提供它们。 有趣的是,write()不会自行添加换行符,因此方法名称实际上可能非常混乱。 它实际上就像一个名为readlines()的虚构方法。

接下来是Python中的一种惯用方法,即将字符串列表写入文件,同时将每个字符串保存在自己的行中:

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

这将负责为您关闭文件。 构造write()连接(连接)列表readlines()中的字符串并使用字符' \ n' 作为胶水。 它比使用+运算符更有效。

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

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

这使用了生成器表达式并动态创建了换行符终止的字符串。 write()遍历此字符串序列并写入每个项目。

编辑:您应该注意的另一点:

write()readlines()之前存在于writelines之前。 readlines()稍后作为writelines()的对应方介绍,因此可以轻松编写通过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)

这会逐行读取输入文件。 只要读取一行,该行就会写入输出文件。 示意性地说,内存中始终只有一行(与读取/写入方法的情况下整个文件内容在内存中相比)。

Jan-Philip Gehrcke answered 2019-08-13T23:03:34Z
-4 votes

实际上,我认为问题在于你的变量" line" 不好。 您将行定义为元组,但我相信write()需要一个字符串。 所有你需要改变的是你的逗号(+)。

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

应该管用。

Kevin answered 2019-08-13T23:04:03Z
-4 votes

如果您只想保存并加载列表,请尝试Pickle

泡菜节省:

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

并加载:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)
Venya answered 2019-08-13T23:04:45Z
-4 votes

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

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()
Gerald answered 2019-08-13T23:05:12Z
translate from https://stackoverflow.com:/questions/12377473/python-write-versus-writelines-and-concatenated-strings