如何在 Python 中正确保存和读取文件内容(避免换行符导致的格式问题)
发布时间 - 2026-02-03 00:00:00 点击率:次本文详解 kivy 应用中因 `readline()` 自动保留 `\n` 而引发的文本错位问题,提供安全读写文件的标准实践,包括自动去除换行符、统一写入逻辑及异常防护建议。
在 Kivy 等 GUI 应用中,文件读写看似简单,但极易因换行符(\n)处理不当导致数据失真——正如你遇到的问题:readline() 读取时会原样包含末尾的换行符,而 TextInput.text 将 \n 渲染为实际换行;当再次用 f.write(text + "\n") 保存时,若原文本已含 \n,就会产生多余空行,造成循环性格式污染。
✅ 正确做法:读取时剥离换行符,写入时统一控制
修改 on_start() 方法,使用 .rstrip('\n') 安全移除可能存在的换行符(推荐 rstrip() 而非 strip(),避免误删首尾空格):
def on_start(self):
_ids = self.sm.get_screen("Screeen").ids
try:
with open("settings.txt", "r", encoding="utf-8") as f:
for attr in "abc":
line = f.readline()
_ids[attr].text = line.rstrip('\n') if line else ""
except FileNotFoundError:
# 首次运行时 settings.txt 不存在,留空即可
pass
except Exception as e:
print(f"读取配置文件失败: {e}")同时优化 on_stop(),避免重复添加 \n 导致空行累积:
def on_stop(self):
try:
with open("settings.txt", "w", encoding="utf-8") as f:
for attr in "abc":
text = self.sm.get_screen("Screeen").ids[attr].text
f.write(text + "\n") # 每行显式写入 \n,确保格式一致
except Exception as e:
print(f"保存配置文件失败: {e}")⚠️ 关键注意事项
- 始终指定 encoding="utf-8":避免跨平台(Windows/Linux/macOS)换行符(\r\n vs \n)和中文乱码问题;
- readline() 返回空字符串 "" 表示 EOF:需判断 if line 防止对空行赋值;
- 不要依赖 f.close() 手动关闭:with 语句已确保资源自动释放;
- 首次启动时文件可能不存在:用 try/except FileNotFoundError 容错,而非假设文件一定存在;
- 若需更健壮配置管理,可考虑 json 格式替代纯文本,天然支持多行、特殊字符与结构化数据:
# 示例:改用 JSON(推荐进阶场景)
import json
def on_start(self):
try:
with open("settings.json", "r", encoding="utf-8") as f:
data = json.load(f)
_ids = self.sm.get_screen("Screeen").ids
_ids.a.text = data.get("a", "")
_ids.b.text = data.get("b", "")
_ids.c.text = data.get("c", "")
except (FileNotF
oundError, json.JSONDecodeError):
pass
def on_stop(self):
data = {
"a": self.sm.get_screen("Screeen").ids.a.text,
"b": self.sm.get_screen("Screeen").ids.b.text,
"c": self.sm.get_screen("Screeen").ids.c.text,
}
with open("settings.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)遵循以上实践,即可彻底解决因换行符导致的“多出空行”问题,让配置文件读写稳定、可预测、跨平台兼容。
立即学习“Python免费学习笔记(深入)”;
# linux
# python
# js
# json
# windows
# mac
# 中文乱码
# macos
# win
# 配置文件
# cos
# EOF
# if
# try
# 字符串
# 循环
# 换行符
# 首次
# 不存在
# 而非
# 进阶
# 就会
# 多出
# 极易
# 启动时
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
EditPlus中的正则表达式实战(5)
Laravel如何实现API速率限制?(Rate Limiting教程)
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
如何在阿里云高效完成企业建站全流程?
Laravel如何使用.env文件管理环境变量?(最佳实践)
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
iOS发送验证码倒计时应用
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
详解阿里云nginx服务器多站点的配置
js实现点击每个li节点,都弹出其文本值及修改
Laravel定时任务怎么设置_Laravel Crontab调度器配置
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
免费网站制作appp,免费制作app哪个平台好?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
高防服务器租用首荐平台,企业级优惠套餐快速部署
PythonWeb开发入门教程_Flask快速构建Web应用
文字头像制作网站推荐软件,醒图能自动配文字吗?
潮流网站制作头像软件下载,适合母子的网名有哪些?
高防服务器租用指南:配置选择与快速部署攻略
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
C语言设计一个闪闪的圣诞树
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
如何在Windows 2008云服务器安全搭建网站?
如何为不同团队 ID 动态生成多个“认领值班”按钮
想要更高端的建设网站,这些原则一定要坚持!
UC浏览器如何设置启动页 UC浏览器启动页设置方法
JavaScript如何实现倒计时_时间函数如何精确控制
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
EditPlus 正则表达式 实战(3)
网站制作软件免费下载安装,有哪些免费下载的软件网站?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何在IIS中新建站点并配置端口与IP地址?
Android Socket接口实现即时通讯实例代码
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
在线制作视频网站免费,都有哪些好的动漫网站?
Linux网络带宽限制_tc配置实践解析【教程】
北京企业网站设计制作公司,北京铁路集团官方网站?


