150

所以我正在学习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()

蟒蛇 2.7

4

5 回答 5

179
  • writelines期望一个可迭代的字符串
  • write需要一个字符串。

line1 + "\n" + line2将这些字符串合并为一个字符串,然后再将其传递给write.

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

于 2012-09-11T20:36:47.800 回答
145

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

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

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

这将逐行读取输入文件。只要读取一行,就会将此行写入输出文件。从示意图上讲,内存中总是只有一行(相比之下,在 readlines/writelines 方法的情况下整个文件内容都在内存中)。

于 2012-09-11T20:40:17.223 回答
-6

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

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

应该管用。

于 2013-09-17T22:18:44.003 回答
-6

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

泡菜保存:

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

和加载:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)
于 2015-03-11T15:29:39.603 回答
-6

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

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()
于 2017-02-06T07:30:12.983 回答