Linux Mint下Python读取文件为空问题求助(aiogram开发场景)
问题排查与修复方案
核心问题分析
你的代码存在几个关键错误,结合Linux文件系统特性,导致了读取异常:
- 变量类型不匹配:
refer = text.split()得到的是列表,但你在判断el.split(':')[0] == refer时,是拿字符串和列表做比较,永远不会相等,循环逻辑完全不会触发。调试时看到"数据变空",是因为readlines()会把文件指针移到文件末尾,之后再读取自然返回空列表。 - 文件打开模式错误:你用
'r'只读模式打开文件,却试图用print(..., file=referals)写入,这会直接抛出IO错误,可能被aiogram的异常捕获机制隐藏,导致你误以为是读取问题。 - 工作目录不一致(Linux特性):Linux下Python脚本的当前工作目录,不一定是你存放脚本的目录。如果
referals_admins文件不在机器人进程的工作目录下,你读取的可能是一个不存在的空文件(或位置错误的文件)。
修复后的代码示例
text = message.text split_text = text.split() # 根据业务逻辑取分割后的目标元素,这里假设取第一个有效字符串作为refer refer = split_text[0] if len(split_text) > 1 else None if refer: # 建议使用绝对路径避免工作目录问题,例如:/home/your_username/bot/referals_admins file_path = 'referals_admins' # 先读取所有内容,修改后重新写入 with open(file_path, 'r') as f: lines = f.readlines() updated = False with open(file_path, 'w') as f: for line in lines: line = line.strip() if not line: f.write('\n') continue parts = line.split(':') if len(parts) != 2: f.write(line + '\n') continue ref_code, count = parts if ref_code == refer: new_count = int(count) + 1 f.write(f'{refer}:{new_count}\n') updated = True else: f.write(line + '\n') # 若为新refer码,追加到文件末尾(可选,根据需求调整) if not updated: f.write(f'{refer}:1\n')
额外排查步骤
- 确认文件路径:在脚本开头添加
import os; print(os.getcwd()),查看机器人运行的当前工作目录,确保referals_admins文件在该目录下,或直接使用绝对路径。 - 检查文件权限:执行
ls -l referals_admins查看权限,确保机器人进程有读写权限,必要时用chmod 644 referals_admins调整权限。
内容的提问来源于stack exchange,提问作者STephanDolskii
相关产品推荐
相关产品推荐

