首页 论坛 置顶 在Python中写文件与使用上下文管理器

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #25304

    今天,我们将继续学习写入和追加文件,同时掌握上下文管理器以安全地处理文件。


    📥 1. 使用open()写入文件

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

    # 创建一个新文件或覆盖现有文件
    with open("output.txt", "w") as f:
        f.write("Hello, World!n")
    
    f.write("这将覆盖文件内容。n")

    注意: "w" 模式在写入之前会清除所有现有内容。


    📄 2. 追加内容到文件

    要在不删除现有数据的情况下添加内容,请使用 "a" 模式:

    
    with open("output.txt", "a") as f:
        f.write("Appending a new line.n")
    

    "a" 保留旧数据,并在末尾添加新内容。


    🔁
    3. 写多行

    您可以使用 writelines() 来写入字符串列表:

    lines = ["第一行n", "第二行n", "第三行n"]
    with open("output.txt", "w") as f:
        f.writelines(lines)
    

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

    你可能会注意到我们到处都在使用 with open(...) as f:。这就是一个 上下文管理器

    为什么使用 with

    • 自动关闭文件。
    • 防止资源泄漏。
    • 优雅地处理错误。

     

    with open("example.txt", "w") as f:
        f.write("安全且干净的文件处理!")
    

    不需要调用 `f.close()` — Python 会为你处理这一切。

     

     5. 写入不同数据类型

    您只能将字符串写入文件。对于其他类型,请进行转换:

    data = {"name": "Alice", "age": 30}
    
    with open("data.txt", "w") as f:
        f.write(str(data))

    对于结构化数据,考虑使用 JSON(第 36 天已涵盖此内容)。


    🔄 6. 安全处理错误

    在处理文件写入时,始终处理异常:

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

    🛠️ 现实世界示例:日志系统

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

    这段代码定义了一个记录事件的函数 `log_event`,它接受一个消息参数。在函数内部,使用 `with` 语句打开一个名为 `log.txt` 的文件,并以追加模式(”a”)进行写入。然后,函数将当前的日期和时间以及传入的消息写入文件中,格式为 `[时间] 消息`,并在末尾添加换行符。最后,调用 `log_event` 函数记录用户登录事件。

    
    log_event("用户上传了一个文件")

    📜 摘要

    • "w" = 写入(创建/覆盖文件)
    • "a" = 追加(向现有文件添加内容)
    • 始终使用 with open() 自动管理资源。
    • 在写入之前转换非字符串数据。
    • 使用错误处理以避免在文件操作期间崩溃。

    🧪 实践挑战

    • 创建一个程序,将用户输入写入文件,直到他们输入 "exit"

     

    • 构建一个简单的日志记录器,将时间戳和消息写入文件。
    • 将一系列名字逐行写入文件,然后再追加更多名字。

     


正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。