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

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

相关推荐
居然JuRan8 分钟前
大模型瘦身术:量化与蒸馏技术全解析
人工智能
艾莉丝努力练剑10 分钟前
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和
大数据·人工智能·线性代数·算法·矩阵·二维前缀和
不去幼儿园17 分钟前
【启发式算法】灰狼优化算法(Grey Wolf Optimizer, GWO)详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法
培风图南以星河揽胜17 分钟前
Java实习模拟面试|离散数学|概率论|金融英语|数据库实战|职业规划|期末冲刺|今日本科计科要闻速递:技术分享与学习指南
java·面试·概率论
二川bro20 分钟前
数据可视化进阶:Python动态图表制作实战
开发语言·python·信息可视化
remaindertime34 分钟前
基于Ollama和Spring AI:实现本地大模型对话与 RAG 功能
人工智能·后端·ai编程
青青子衿_2135 分钟前
TikTok爬取——视频、元数据、一级评论
爬虫·python·selenium
y***548837 分钟前
Vue语音识别开发
人工智能·语音识别
sdjnled22943 分钟前
山东裸眼3D立体LED显示屏专业服务商
人工智能·3d
忘却的旋律dw1 小时前
使用LLM模型的tokenizer报错AttributeError: ‘dict‘ object has no attribute ‘model_type‘
人工智能·pytorch·python