Python按固定长度读取Windows文本文件处理\r\n换行符异常问题求助
问题解决方法
问题根本原因
- Windows系统下以默认文本模式(
'r')打开文件时,会自动将文件实际存储的2字节换行符\r\n转换为1个\n字符,file.read()的计数单位是转换后的字符数,但file.seek()使用的偏移量是文件原始字节偏移,二者计数规则不匹配 - 你自行维护的
self.pointer累加的是读取的字符数,和实际文件的字节偏移不一致,导致下一次seek定位到了错误的字节位置,进而出现重复读取字符的问题
解决方案
方案1:改用二进制模式打开文件,自行处理换行转换
二进制模式下seek和read的单位都是字节,不存在转换导致的计数偏差,读取内容后再解码为字符串、处理换行即可:
with open(self.filename, 'rb') as file: file.seek(self.pointer) if self.pointer <= self.file_size: buffer_bytes = file.read(self.buffersize) # 解码为字符串的同时统一换行符 buffer = buffer_bytes.decode('utf-8').replace('\r\n', '\n') # 直接读取当前实际字节偏移更新指针,不要自行累加 self.pointer = file.tell() else: buffer = ""
方案2:文本模式下使用file.tell()获取实际偏移
如果要保留文本模式的自动换行转换逻辑,只需要将自行累加指针的逻辑替换为调用file.tell()获取当前实际字节偏移即可:
with open(self.filename, 'r') as file: file.seek(self.pointer) if self.pointer <= self.file_size: buffer = file.read(self.buffersize) # 替换原有的self.pointer = self.pointer + self.buffersize逻辑 self.pointer = file.tell() else: buffer = ""
内容的提问来源于stack exchange,提问作者Thomas Juul Eriksen
相关产品推荐
相关产品推荐

