在 Python 中,write() 和 writelines() 是文件对象用于写入数据的方法。它们都属于文本模式('w'、'a' 等)和二进制模式('wb'、'ab' 等)下的写入操作。理解它们的区别和适用场景,可以帮助你高效、正确地写入文件。
一、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() 方法
语法
参数
返回值
特点
示例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() 对比
四、如何自动添加换行符?
方案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. 缓冲区与立即写入
3. 文件模式选择
4. 写入非字符串数据
七、性能建议
八、总结
最佳实践:
需要写入多行时,优先使用 writelines() 配合生成器。
确保每行末尾包含换行符,否则会出现内容粘连。
始终使用 with open(...) as f: 管理文件资源。
根据需求选择正确的模式('w' 覆盖,'a' 追加)。
通过合理使用 write() 和 writelines(),可以灵活地控制文件的写入过程,写出高效、可靠的文件处理代码。