ZetCode

Python writelines 函数

最后修改时间:2025 年 3 月 26 日

本综合指南探讨了 Python 的 writelines 函数,这是一种有效地将多行写入文件的方法。我们将介绍它的用法、与 write 的区别、常见模式和最佳实践。通过实际示例,您将掌握在 Python 中将序列写入文件的方法。

基本定义

writelines 方法将字符串序列写入文件。它不会自动添加换行符。该序列可以是包含字符串的任何可迭代对象。与 write 不同,它可以一次处理多个字符串。

当您需要写入字符串列表时,此方法特别有用。它比循环中多次调用 write 更有效。但是,如果需要在元素之间添加换行符,则必须手动管理。

基本 writelines 示例

此示例演示了使用 writelines 将字符串列表写入文件的最简单用法。请注意,我们显式地包含了换行符。

basic_writelines.py
lines = ['First line\n', 'Second line\n', 'Third line\n']

with open('output.txt', 'w') as file:
    file.writelines(lines)

此代码创建或覆盖“output.txt”并写入三行。列表中的每个字符串都包含换行符。如果没有这些换行符,所有文本将显示在一行上。with 语句确保正确的文件关闭。

writelines 方法不返回任何值。它只是连续地写入序列元素。该方法比在循环中写入更快,因为它进行的系统调用更少。

不使用显式换行符写入

此示例显示了省略换行符时会发生什么。字符串被连续写入,没有分隔。

no_newlines.py
items = ['apple', 'banana', 'cherry']

with open('fruits.txt', 'w') as file:
    file.writelines(items)

生成的文件将包含“applebananacherry”,没有任何空格或换行符。这表明 writelines 确实完成了其名称所暗示的操作 - 写入行而不添加任何额外内容。

要添加分隔符,您可以使用带有换行符的生成器表达式,或者映射列表以添加换行符。此行为与其他一些语言的类似方法不同,后者可能会自动添加换行符。

使用生成器表达式

生成器表达式可以在写入之前有效地转换数据。此示例在写入期间将行号添加到每一行。

generator_writelines.py
data = ['red', 'green', 'blue']

with open('colors.txt', 'w') as file:
    file.writelines(f"{i+1}: {color}\n" for i, color in enumerate(data))

此代码将编号的行写入文件。生成器表达式动态地创建格式化的字符串,而无需创建中间列表。这对于大型数据集来说是内存高效的。

f-字符串使用其索引(从 1 开始)和值格式化每一行。writelines 方法消耗生成器并写入结果。这种模式在文件输出期间转换数据时很常见。

从一个文件写入到另一个文件

此示例从一个文件读取行并使用 writelines 将它们写入另一个文件。它演示了有效的文件到文件复制。

file_copy_writelines.py
with open('source.txt', 'r') as source:
    with open('destination.txt', 'w') as dest:
        dest.writelines(source)

此代码将“source.txt”复制到“destination.txt”。文件对象是一个迭代器,产生行,writelines 直接使用它。这种方法是内存高效的,因为它不会加载整个文件。

请注意,这保留了原始行尾。对于二进制数据或精确复制,请使用二进制模式。这种模式非常适用于面向行的文本处理以及文件之间的转换。

写入前过滤

此示例演示了在写入之前过滤行。只有包含“a”的行会被写入输出文件。

filter_writelines.py
lines = ['apple\n', 'banana\n', 'cherry\n', 'date\n']

with open('filtered.txt', 'w') as file:
    file.writelines(line for line in lines if 'a' in line)

输出文件将只包含“apple”和“banana”行。生成器表达式在写入之前过滤序列。这种模式对于选择性输出而无需临时列表非常强大。

您可以在过滤器中组合多个条件。这种方法对于大型数据集来说是内存高效的,因为它一次处理一个项目,而不存储整个过滤后的集合。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程