苦练Python第46天:文件写入与上下文管理器

前言

大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!

欢迎来到 苦练Python第 46 天!

昨天我们研究了如何用 open() 读取文件,今天要更进一步------学习写入与追加文件 ,并用上下文管理器安全地管理文件资源。


📥 1. 用 open() 写入文件

创建或覆盖文件时,请使用 "w" 模式:

python 复制代码
# 新建文件或覆盖原有内容
with open("output.txt", "w") as f:
    f.write("Hello, World!\n")
    f.write("这将覆盖原有内容。\n")

注意: "w" 会在写入前清空原有内容。


📄 2. 追加内容到文件

若想保留旧数据,只需在末尾追加,请使用 "a" 模式:

python 复制代码
with open("output.txt", "a") as f:
    f.write("追加一行新内容。\n")

"a" 不会删除旧数据,只会在文件尾部添加新内容。


🔁 3. 批量写入多行

使用 writelines() 可一次性写入字符串列表:

python 复制代码
lines = ["第1行\n", "第2行\n", "第3行\n"]
with open("output.txt", "w") as f:
    f.writelines(lines)

🧠 4. 使用上下文管理器 (with)

你可能已经发现,我们到处都在用 with open(...) as f:------这就是上下文管理器

为什么要用 with

  • 自动关闭文件,防止资源泄露
  • 即使发生异常也能优雅地清理资源
python 复制代码
with open("example.txt", "w") as f:
    f.write("安全又干净的文件操作!")

无需再手动调用 f.close(),Python 会替你完成。


📌 5. 写入不同类型的数据

文件只能写入字符串。其他类型请先转换:

python 复制代码
data = {"name": "Alice", "age": 30}

with open("data.txt", "w") as f:
    f.write(str(data))

如需结构化存储,可使用 JSON。


🔄 6. 安全地处理错误

写入文件时务必捕获异常:

python 复制代码
try:
    with open("output.txt", "w") as f:
        f.write("重要数据")
except IOError:
    print("写入文件时出错!")

🛠️ 实战:构建简易日志系统

python 复制代码
from datetime import datetime

def log_event(message):
    with open("log.txt", "a") as f:
        f.write(f"[{datetime.now()}] {message}\n")

log_event("用户登录")
log_event("用户上传了文件")

📜 小结

模式 说明
"w" 写入(新建或覆盖)
"a" 追加(保留原有内容)
  • 始终使用 with open() 自动管理资源
  • 非字符串数据需先转换
  • 用异常处理保证健壮性

🧪 动手挑战

1. 编写程序,持续接收用户输入并写入文件,直到用户键入 exit

python 复制代码
# challenge1_user_input.py
# 功能:持续接收用户输入并写入文件,直到输入 exit 为止
# 使用方法:python challenge1_user_input.py

def collect_inputs():
    # 使用 with open 上下文管理器,文件在退出时自动关闭
    with open("user_inputs.txt", "w", encoding="utf-8") as f:
        print("请输入内容(输入 exit 结束):")
        while True:
            line = input(">>> ")
            if line.strip().lower() == "exit":
                print("已结束输入,内容已保存到 user_inputs.txt")
                break
            # 逐行写入,保留用户输入的换行
            f.write(line + "\n")

if __name__ == "__main__":
    collect_inputs()

2. 实现一个带时间戳的简单日志器。

python 复制代码
# challenge2_simple_logger.py
# 功能:将消息及当前时间戳追加写入 log.txt
# 使用方法:python challenge2_simple_logger.py [message]

import sys
from datetime import datetime

def log_event(msg: str):
    # 以追加模式打开,保证旧日志不被覆盖
    with open("log.txt", "a", encoding="utf-8") as log_file:
        # 格式化时间戳精确到秒
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_file.write(f"[{timestamp}] {msg}\n")

if __name__ == "__main__":
    # 支持命令行参数传入日志内容,若无参数则提示手动输入
    message = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else input("请输入日志内容:")
    log_event(message)
    print("日志已写入 log.txt")

3. 将一组姓名逐行写入文件,后续再追加更多姓名。

python 复制代码
# challenge3_names_manager.py
# 功能:
#   1. 首次运行:将初始姓名列表写入 names.txt,每人一行
#   2. 再次运行:可继续追加更多姓名
# 使用方法:python challenge3_names_manager.py

def write_initial_names():
    initial_names = ["张三", "李四", "王五"]
    with open("names.txt", "w", encoding="utf-8") as f:
        # writelines 不会自动添加换行,需手动处理
        f.writelines(f"{name}\n" for name in initial_names)
    print("初始姓名列表已写入 names.txt")

def append_more_names():
    more = input("请输入要追加的姓名,用空格分隔:").split()
    if not more:
        print("未输入任何姓名,跳过追加。")
        return
    with open("names.txt", "a", encoding="utf-8") as f:
        f.writelines(f"{name}\n" for name in more)
    print("追加完成,姓名已写入 names.txt")

if __name__ == "__main__":
    # 如果文件不存在,先写入初始列表
    import os
    if not os.path.isfile("names.txt"):
        write_initial_names()
    append_more_names()

最后感谢阅读!欢迎关注我,微信公众号倔强青铜三。欢迎 点赞收藏关注,一键三连!

相关推荐
虫无涯3 小时前
Dify Agent + AntV 实战:从 0 到 1 打造数据可视化解决方案
人工智能
Dm_dotnet5 小时前
公益站Agent Router注册送200刀额度竟然是真的
人工智能
算家计算5 小时前
7B参数拿下30个世界第一!Hunyuan-MT-7B本地部署教程:腾讯混元开源业界首个翻译集成模型
人工智能·开源
用户2519162427115 小时前
Python之语言特点
python
机器之心5 小时前
LLM开源2.0大洗牌:60个出局,39个上桌,AI Coding疯魔,TensorFlow已死
人工智能·openai
刘立军6 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
天天扭码6 小时前
来全面地review一下Flex布局(面试可用)
前端·css·面试
Juchecar6 小时前
交叉熵:深度学习中最常用的损失函数
人工智能
Mor_6 小时前
UE5 网络通信协议学习笔记
面试