Python文件追加写入后读取最后一行异常问题
问题分析与解决方案
首先,你的问题根源在于写入内容的格式不一致以及固定偏移量的计算错误,我们逐一拆解:
为什么脚本写入后读取到空行?
- 缺少换行符:你用
write('some string')写入的内容没有换行符\n,而手动编辑文件时,绝大多数文本编辑器会自动在内容末尾添加换行符,这导致两种场景下的文件结构完全不同:- 手动写入的文件:内容是
some string\n(总长度12字节) - 脚本写入的文件:内容是
some string(总长度11字节)
- 手动写入的文件:内容是
- 偏移量计算错误:你使用
seek(-12, 2)尝试从文件末尾往前跳12字节,但脚本写入的文件总长度只有11字节,此时seek会默认定位到文件开头(偏移量0)。如果文件里没有换行符,readline()会读取整个文件内容,但如果你的实际场景中存在其他干扰(比如多次写入导致长度变化),就可能出现读取到空行的情况。
解决方案
方案1:写入时添加换行符(推荐)
文本文件的标准格式是每行以换行符结尾,修改写入代码,在字符串末尾加上\n:
import os if not os.path.isfile('./test.rpt'): with open('test.rpt', 'a') as f: f.write('some string\n') # 追加换行符
此时文件内容长度为12字节,seek(-12, 2)会准确定位到最后一行的起始位置,readline()读取到完整的行内容,rstrip('\n')后就能得到预期的some string。
方案2:动态查找最后一行(鲁棒性更强)
如果无法保证每行长度固定,推荐从文件末尾反向扫描换行符,动态定位最后一行的起始位置,这种方法适用于任意长度的行:
import os with open('test.rpt', 'rb') as f: # 从文件末尾开始反向查找换行符 f.seek(-1, os.SEEK_END) position = f.tell() while position > 0: char = f.read(1) if char == b'\n': break position -= 1 f.seek(position, os.SEEK_SET) # 读取最后一行并处理 last_line = f.readline().decode('utf-8').rstrip('\n') print(f'Last line is: {last_line}')
这个方法即使文件最后一行没有换行符(比如脚本写入的情况),也能正确读取整个内容作为最后一行。
方案3:修正固定偏移量(仅适用于固定长度行)
如果你坚持不添加换行符,可以根据实际字符串长度调整seek的偏移量。比如'some string'的长度是11,修改代码如下:
with open('test.rpt', 'rb') as f: f.seek(-11, 2) # 匹配字符串实际长度 line = f.readline().decode("utf-8") last_line = line.rstrip('\n') print(f'Last line is: {last_line}')
但这种方法局限性很大,一旦写入的字符串长度变化就会失效,不推荐用于生产环境。
内容的提问来源于stack exchange,提问作者user9900698
相关产品推荐
相关产品推荐

