Python - write versus writelines and concatenated strings

2024-04-26 10:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想到了:

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

如果我想这样做:

textdoc.write(lines)

我得到一个错误。但如果我输入:

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

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

Python2.7 当我在google上搜索时,我发现大多数资源都超出了我的想象,我仍然是个普通人。


Tags: 对象字符串用户targetwritelines错误nlgoogle
3条回答

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

泡菜保存:

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

以及装载:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)

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

想法如下:如果你想写一个字符串,你可以用write()来完成。如果有一个字符串序列,可以使用writelines()将它们全部写入。

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

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

字符串的性质对这两个函数都不重要,也就是说,它们只是将您提供的任何内容写入文件。有趣的是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()遍历这个字符串序列并写入每个项。

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

在介绍writelines()之前就存在write()readlines()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方法中,与内存中的整个文件内容相比)。

  • writelines需要一个iterable字符串
  • write需要单个字符串。

line1 + "\n" + line2在传递给write之前,将这些字符串合并为一个字符串。

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

相关问题 更多 >