提问者:小点点

写()与写线()和连接字符串


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

我想到了:

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

如果我尝试这样做:

textdoc.write(lines)

我犯了一个错误。但如果我输入:

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

然后它工作正常。为什么我不能在写()中为换行符使用字符串,但我可以在写线()中使用它?

Python 2.7


共3个答案

匿名用户

  • writelines需要一组字符串
  • write需要一个字符串

line1“\n”line2将这些字符串合并为一个字符串,然后将其传递给write

请注意,如果有许多行,可能需要使用“\n”。连接(列出行)

匿名用户

为什么我不能使用一个字符串的换行符写(),但我可以使用它写()?

其思想如下:如果要编写单个字符串,可以使用write()完成。如果有一系列字符串,可以使用writelines()将它们全部写入。

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

writelines(arg)需要一个iterable作为参数(iterable对象可以是元组、列表、字符串或最一般意义上的迭代器)。迭代器中包含的每个项都应该是字符串。字符串的元组是您提供的,因此一切正常。

字符串的性质对这两个函数都不重要,也就是说,它们只向文件写入您提供的任何内容。有趣的是,writelines()本身并没有添加换行符,因此方法名实际上可能非常混乱。实际上,它的行为就像一个虚构的方法,名为write\u all\u这些字符串(序列)

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

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

这将为您关闭文件。构造“\n”。连接(行)连接(连接)列表中的字符串,并使用字符“\n”作为粘合剂。它比使用运算符更有效。

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

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

这使用了一个生成器表达式,并动态地创建以换行符结尾的字符串。写线()遍历这个字符串序列并写入每个项。

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

写()读线()在引入写线()之前就存在了。只是通过readline()读取:

outfile.writelines(infile.readlines())

实际上,这就是writelines名称如此混乱的主要原因。而且,今天,我们真的不想再使用这种方法了readlines()writelines()开始写入数据之前,将整个文件读取到计算机内存中。首先,这可能会浪费时间。为什么不在读取其他部分的同时开始写入部分数据?但是,最重要的是,这种方法可能非常消耗内存。在极端情况下,输入文件比机器内存大,这种方法甚至不起作用。这个问题的解决方案是只使用迭代器。一个有效的例子:

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

这将逐行读取输入文件。一旦读取了一行,这一行就会写入输出文件。从示意图上讲,内存中始终只有一行(与读/写行方法中的整个文件内容在内存中相比)。

匿名用户

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

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

应该有用。