gpt4 book ai didi

python - 在 Python 中不读取文件最后 N 行的简单方法

转载 作者:行者123 更新时间:2023-11-28 21:18:23 24 4
gpt4 key购买 nike

我想逐行读取文件,除了最后 N 行。在 Python 中,我如何知道在不到达文件末尾和回溯/丢弃最后 N 行的情况下停止的位置?要求 # lines = X 并循环 (X-N) 是解决此问题的好方法吗?

执行此操作的最简单/最 Pythonic 方法是什么?

最佳答案

三种不同的解决方案:

1) 又快又脏,看约翰的回答:

with open(file_name) as fid:
lines = fid.readlines()
for line in lines[:-n_skip]:
do_something_with(line)

这种方法的缺点是你必须先读取内存中的所有行,这对于大文件来说可能是个问题。

2) 两次通过

处理文件两次,一次计算行数 n_lines,在第二次处理中只处理前 n_lines - n_skip 行:

# first pass to count
with open(file_name) as fid:
n_lines = sum(1 for line in fid)

# second pass to actually do something
with open(file_name) as fid:
for i_line in xrange(n_lines - n_skip): # does nothing if n_lines <= n_skip
line = fid.readline()
do_something_with(line)

此方法的缺点是您必须遍历文件两次,在某些情况下这可能会更慢。然而,好处是您的内存中永远不会超过一行。

3)使用缓冲区,类似于Serge的解决方案

如果您只想遍历文件一次,则只有知道 i + n_skip 行存在时,您才能确定可以处理 i 行。这意味着您必须首先将 n_skip 行保存在临时缓冲区中。一种方法是实现某种 FIFO 缓冲区(例如,使用实现循环缓冲区的生成器函数):

def fifo(it, n):
buffer = [None] * n # preallocate buffer
i = 0
full = False
for item in it: # leaves last n items in buffer when iterator is exhausted
if full:
yield buffer[i] # yield old item before storing new item
buffer[i] = item
i = (i + 1) % n
if i == 0: # wrapped around at least once
full = True

使用一系列数字进行快速测试:

In [12]: for i in fifo(range(20), 5):
...: print i,
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

您在文件中使用它的方式:

with open(file_name) as fid:
for line in fifo(fid, n_skip):
do_something_with(line)

请注意,这需要足够的内存来临时存储 n_skip 行,但这仍然比第一个解决方案中读取内存中的所有行要好。

这 3 种方法中哪一种最好是代码复杂性、内存和速度之间的权衡,这取决于您的具体应用。

关于python - 在 Python 中不读取文件最后 N 行的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26696393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com