You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何追加文本文件内容不覆盖?是否有专属追加函数?

在Python中向文本文件追加写入新记录的方法

嘿,这个问题其实在Python文件操作里挺基础但关键的,我来给你讲明白~

首先,核心思路是用Python内置的open()函数,指定追加模式,而不是默认的写入模式(默认'w'会直接覆盖原有内容)。

1. 基础的追加写法(推荐用with语句)

with语句是Python推荐的文件操作方式,它会自动帮你关闭文件,避免资源泄漏。你只需要把打开模式设为'a'(append的缩写)就行:

追加单行内容

# 打开文件,以追加模式写入,指定UTF-8编码避免乱码
with open('your_records.txt', 'a', encoding='utf-8') as f:
    f.write('2024-05-20 新增的一条记录\n')  # 记得加换行符,不然新内容会和旧内容挤在一起

追加多行内容

如果要一次性加多条记录,可以用writelines()方法:

new_records = [
    '2024-05-21 第一条新记录\n',
    '2024-05-21 第二条新记录\n',
    '2024-05-21 第三条新记录\n'
]

with open('your_records.txt', 'a', encoding='utf-8') as f:
    f.writelines(new_records)

关于'a'模式的小细节:

  • 如果目标文件不存在,'a'模式会自动创建一个新文件;
  • 打开文件后,文件指针会直接跳到文件末尾,所有写入操作都会追加在原有内容之后,完全不会覆盖旧内容。

2. 需要追加+读取的场景:用'a+'模式

如果你需要在追加内容的同时,还能读取文件里的内容,可以用'a+'模式。不过要注意:打开文件后指针在末尾,读取前需要手动把指针移到文件开头(用seek(0)):

with open('your_records.txt', 'a+', encoding='utf-8') as f:
    # 先追加内容
    f.write('2024-05-22 追加的新记录\n')
    # 将文件指针移到开头,才能读取全部内容
    f.seek(0)
    # 读取文件所有内容
    all_content = f.read()
    print(all_content)

3. 有没有专门的追加函数?

其实Python标准库并没有单独的“追加函数”,因为追加操作本质是通过文件打开模式来控制的。不过你可以自己封装一个便捷函数,方便重复使用:

def append_record(file_path, record, add_newline=True):
    """
    向文件追加一条记录
    :param file_path: 文件路径
    :param record: 要追加的记录内容
    :param add_newline: 是否自动添加换行符,默认True
    """
    # 如果需要换行且内容末尾没有换行符,就加上
    if add_newline and not record.endswith('\n'):
        record += '\n'
    with open(file_path, 'a', encoding='utf-8') as f:
        f.write(record)

# 调用这个函数
append_record('daily_log.txt', '完成了Python文件操作的学习')
append_record('daily_log.txt', '这条记录不需要换行', add_newline=False)

小提醒

  • 一定要指定encoding='utf-8',不然在不同操作系统(Windows/macOS/Linux)下可能会出现乱码问题;
  • 如果有多个进程/线程同时往同一个文件追加内容,可能会出现内容交错的情况,这时候需要用到文件锁(Unix用fcntl模块,Windows用msvcrt模块),不过单线程场景一般不用考虑这个。

内容的提问来源于stack exchange,提问作者rko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:36:39