我想一行一行地反向阅读下面给出的文本文件。我不想使用readlines()
或read()
。你知道吗
a.txt
2018/03/25-00:08:48.638553 508 7FF4A8F3D704 snononsonfvnosnovoosr
2018/03/25-10:08:48.985053 346K 7FE9D2D51706 ahelooa afoaona woom
2018/03/25-20:08:50.486601 1.5M 7FE9D3D41706 qojfcmqcacaeia
2018/03/25-24:08:50.980519 16K 7FE9BD1AF707 user: number is 93823004
2018/03/26-00:08:50.981908 1389 7FE9BDC2B707 user 7fb31ecfa700
2018/03/26-10:08:51.066967 0 7FE9BDC91700 Exit Status = 0x0
2018/03/26-15:08:51.066968 1 7FE9BDC91700 std:ZMD:
预期结果:
2018/03/26-15:08:51.066968 1 7FE9BDC91700 std:ZMD:
2018/03/26-10:08:51.066967 0 7FE9BDC91700 Exit Status = 0x0
2018/03/26-00:08:50.981908 1389 7FE9BDC2B707 user 7fb31ecfa700
2018/03/25-24:08:50.980519 16K 7FE9BD1AF707 user: number is 93823004
2018/03/25-20:08:50.486601 1.5M 7FE9D3D41706 qojfcmqcacaeia
2018/03/25-10:08:48.985053 346K 7FE9D2D51706 ahelooa afoaona woom
2018/03/25-00:08:48.638553 508 7FF4A8F3D704 snononsonfvnosnovoosr
我的解决方案:
with open('a.txt') as lines:
for line in reversed(lines):
print(line)
Whlie@martineau的解决方案在没有将整个文件加载到内存的情况下完成了任务,但是它会浪费时间读取整个文件两次。你知道吗
一种可以说更有效的一次性方法是从文件末尾以相当大的块读入缓冲区,从缓冲区末尾查找下一个换行符(减去最后一个字符的尾随换行符),如果找不到,则向后查找并继续以块读入,并将块预先放入缓冲区,直到找到为止找到换行符。使用较大的块大小进行更有效的读取,只要它在内存限制内:
以便:
输出:
不,没有更好的办法了。根据定义,文件是某种基本数据类型的顺序组织。文本文件的类型是字符。您正试图对文件强制使用不同的组织,字符串之间用换行符分隔。你知道吗
因此,您必须读取文件,重新转换为所需的格式,然后以相反的顺序执行该组织。例如,如果你多次需要这个。。。以行的形式读取文件,将行存储为数据库记录,然后根据需要遍历记录。你知道吗
file
接口只在一个方向上读取。您可以seek()
到另一个位置,但是标准的I/O操作只适用于增加位置描述。你知道吗为了使您的解决方案能够工作,您需要读入不能
reverse
文件描述符的隐式迭代器的整个文件。你知道吗这里有一种方法可以做到这一点,而不必一次将整个文件读入内存。它确实需要先读取整个文件,但只存储每行的起始位置。一旦知道了这一点,它就可以使用
seek()
方法以所需的任何顺序随机访问每一个。你知道吗下面是使用输入文件的示例:
输出:
更新
这里有一个版本可以做同样的事情,但是使用Python的^{} 模块来memory-map文件,它应该通过利用OS/硬件的虚拟内存功能来提供更好的性能。你知道吗
这是因为,正如PyMOTW-3所说:
代码:
相关问题 更多 >
编程相关推荐