我正在制作一个脚本,用于在文件的特定位置显示文本。然而,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()
