前言
大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
欢迎来到 苦练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()
最后感谢阅读!欢迎关注我,微信公众号 :
倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!