Skip to main content
 首页 » 编程设计

python seek() 和 read() 以不同方式计算文件位置

2025年05月04日10lyj

我正在制作一个脚本,用于在文件的特定位置显示文本。然而,seek() 和 read() 的计数方式存在差异。它是这样的。

我的文本文件是:

1 
% 
2 
% 
― 
% 
4 
% 
5 
% 
6 

第 5 行的 '―' 是单杠 (unicode 0x2015) 而不是破折号。 “%”用作分隔符。

以下数据作为文件索引

0 2 ['1\n'] 
4 2 ['2\n'] 
8 4 ['―\n'] 
14 2 ['4\n'] 
18 2 ['5\n'] 
22 2 ['6\n'] 

第一列是字符串在文件中的位置(数字),第二列是长度,第三列是要显示的文本(第 1、3、5、7、9、11 行的数字)文本文件)。

我正在尝试读取特定位置的文件,如下所示:

f = open('myfile.txt', 'r', encoding='utf-8') 
f.seek(start) 
text = f.read(length) 
f.close() 

其中 'start' 和 'length' 是索引文件的第一列和第二列,'text' 是要显示的文本。这对于显示索引文件中除第 5 行(带有水平条的行)之外的所有行的内容非常有用,因为 seek() 将水平条的长度解释为 3,因此索引中的总长度为 4文件(3 个用于水平条,1 个用于 '\n'),而 read() 将水平线的长度解释为只有一个,从而创建以下输出:

― 
% 
(blank space) 

也就是说,它包括水平条、它的“\n”、分隔符和它的“\n”(四个字符)。这种影响是累积的,越多的水平条或任何其他不在 utf-8 中的 unicode 字符都会增加错误显示的行数。

知道如何解决这个问题吗?

请您参考如下方法:

在 python 3 中,当您以文本模式打开文件时,例如“r”,在您和原始文件之间有一个解码器。在这种情况下,它是 UTF-8 解码器。 “文件位置”实际上没有意义,因为文本级别的字符索引与文件中的字节索引不同。此外,python 在后台进行缓存以帮助解码。

解决方案是先读取二进制再解码

f = open('myfile.txt', 'rb') 
f.seek(start) 
text = f.read(length).decode(encoding='utf-8') 
f.close()