当前位置:首页>python>Python学习--write() 和 writelines() 函数

Python学习--write() 和 writelines() 函数

  • 2026-10-11 07:17:55
Python学习--write() 和 writelines() 函数

在 Python 中,write() 和 writelines() 是文件对象用于写入数据的方法。它们都属于文本模式('w'、'a' 等)和二进制模式('wb'、'ab' 等)下的写入操作。理解它们的区别和适用场景,可以帮助你高效、正确地写入文件。

一、write() 方法

语法

file.write(data)

参数

  • data:要写入的数据。

    • 文本模式:必须是字符串(str)。

    • 二进制模式:必须是字节串(bytes 或 bytearray)。

返回值

  • 返回写入的字符数(文本模式)或字节数(二进制模式)。

特点

  • 一次写入一个字符串或字节串。

  • 不会自动添加换行符,需要手动包含 '\n' 才能换行。

  • 可多次调用 write() 连续写入。

示例1:基本写入

with open('output.txt', 'w', encoding='utf-8') as f:    f.write("Hello, World!\n")    f.write("第二行\n")

示例2:二进制写入

data = b'\x89PNG\r\n\x1a\n'with open('image.png', 'wb') as f:    f.write(data)

示例3:写入并获取写入字节数

with open('test.txt', 'w') as f:    n = f.write("Python")    print(f"写入了 {n} 个字符")  # 输出:写入了 6 个字符

二、writelines() 方法

语法

file.writelines(lines)

参数

  • lines:一个可迭代对象(如列表、元组、生成器),其中每个元素是要写入的字符串(文本模式)或字节串(二进制模式)。

返回值

  • None(无返回值)

特点

  • 一次性写入多个字符串(或字节串)。

  • 不会自动添加换行符,需要每个字符串自己包含换行符 '\n'。

  • 适合将一组行批量写入文件,比多次调用 write() 更高效。

示例1:写入多行(手动添加换行符)

lines = ["第一行\n", "第二行\n", "第三行\n"]with open('output.txt', 'w', encoding='utf-8') as f:    f.writelines(lines)

示例2:从列表写入(不含换行符)

data = ["apple", "banana", "cherry"]with open('fruits.txt', 'w') as f:    # 需要手动添加换行符    f.writelines([line + '\n' for line in data])

示例3:二进制模式写入字节串列表

lines = [b'first\n', b'second\n', b'third\n']with open('data.bin', 'wb') as f:    f.writelines(lines)

三、write() 与 writelines() 对比

 特性
write()
writelines()
 参数类型
单个字符串/字节串
可迭代对象(元素为字符串/字节串)
 写入数量
一次写入一个
一次写入多个
 自动换行
❌ 否
❌ 否
 返回值
写入的字符/字节数
None
 适用场景
少量数据或需要精确控制写入位置
批量写入多行数据

四、如何自动添加换行符?

方案1:在字符串中包含 \n

with open('out.txt', 'w') as f:    f.write("line1\n")    f.write("line2\n")

方案2:在 writelines() 中对每个元素添加 \n

lines = ["line1", "line2", "line3"]with open('out.txt', 'w') as f:    f.writelines([line + '\n' for line in lines])

方案3:使用生成器表达式(节省内存)

def generate_lines(data):    for item in data:        yield item + '\n'with open('out.txt', 'w') as f:    f.writelines(generate_lines(["a", "b", "c"]))

五、实际应用示例

1. 逐行写入日志

import datetimedef log_message(msg):    with open('app.log', 'a', encoding='utf-8') as f:        timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')        f.write(f"[{timestamp}] {msg}\n")log_message("应用启动")log_message("用户登录")

2. 将列表数据写入 CSV 格式

data = [    ["Name", "Age", "City"],    ["Alice", 25, "Beijing"],    ["Bob", 30, "Shanghai"]]withopen('people.csv', 'w', newline='', encoding='utf-8') as f:    for row in data:        line = ','.join(map(str, row)) + '\n'        f.write(line)   # 或使用 f.writelines([line])

3. 使用 writelines() 高效保存结果

results = ["result1", "result2", "result3"]with open('results.txt', 'w') as f:    # 添加换行符后批量写入    f.writelines(f"{res}\n" for res in results)

六、注意事项

1. 换行符跨平台问题

  • Windows 默认换行符是 \r\n,Linux/macOS 是 \n。

  • 使用 open() 时,可以通过 newline 参数控制换行符处理:

    # 写入时使用系统默认换行符with open('file.txt', 'w', newline='') as f:    f.write("line1\nline2\n")

    newline='' 表示不转换,\n 会被原样写入。若省略 newline,则 \n 会被转换为系统默认值。

2. 缓冲区与立即写入

  • 默认情况下,写入的数据先进入缓冲区,达到一定量或文件关闭时才真正写入磁盘。

  • 如需立即写入,可以调用 flush():

    f.write("important")f.flush()
  • 或在 open() 中禁用缓冲(仅限二进制模式):

    with open('data.bin', 'wb', buffering=0) as f:    f.write(b'x')

3. 文件模式选择

  • 使用 'w' 会覆盖原有内容。

  • 使用 'a' 会追加到文件末尾。

  • 使用 'x' 可以独占创建,文件已存在时会抛出 FileExistsError。

4. 写入非字符串数据

  • 文本模式下不能写入 int 或 float,必须转换为字符串:

    f.write(str(123))
  • 二进制模式下必须写入 bytes 或 bytearray:

    f.write(b'\x00\x01')

七、性能建议

  • 少量写入:使用 write() 足够。

  • 大量行写入:使用 writelines() 或生成器表达式,减少函数调用开销。

  • 超大文件:考虑分块写入,避免内存占用过高。

八、总结

 方法
用途
换行
性能
write()
写入单个字符串
手动添加 \n
一般
writelines()
写入字符串列表/可迭代对象
手动添加 \n
较好(批量)

最佳实践:

  • 需要写入多行时,优先使用 writelines() 配合生成器。

  • 确保每行末尾包含换行符,否则会出现内容粘连。

  • 始终使用 with open(...) as f: 管理文件资源。

  • 根据需求选择正确的模式('w' 覆盖,'a' 追加)。

通过合理使用 write() 和 writelines(),可以灵活地控制文件的写入过程,写出高效、可靠的文件处理代码。

最新文章

随机文章