苦练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()

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

相关推荐
F2的AI学习笔记7 分钟前
AI智能体工具调用终极指南:从Function Calling到MCP的三大方案详解
人工智能
北辰alk7 分钟前
边缘端AI部署全面指南:原理、方案与实战代码
人工智能
噜~噜~噜~13 分钟前
LSTM(Long Short-Term Memory)个人理解
人工智能·lstm·双层lstm·多层lstm
翔云 OCR API17 分钟前
基于深度学习与OCR研发的报关单识别接口技术解析
人工智能·深度学习·ocr
wwlsm_zql22 分钟前
京津冀工业智能体赋能:重构产业链升级新篇章
人工智能·重构
前端老宋Running23 分钟前
前端防抖与节流一篇讲清楚
前端·面试
lzjava202433 分钟前
Spring AI实现一个智能客服
java·人工智能·spring
hweiyu0042 分钟前
数据挖掘 miRNA调节网络的构建(视频教程)
人工智能·数据挖掘
wshlp1234561 小时前
deepseek api 灵活使用
python
飞哥数智坊1 小时前
AI Coding 新手常见的3大误区
人工智能·ai编程