小能豆

搜索文件最后 X 行的最有效方法?

python

我有一个文件,但我不知道它有多大(它可能很大,但大小会有很大差异)。我想搜索最后 10 行左右,看看其中是否有任何一个与字符串匹配。我需要尽可能快速有效地完成此操作,并且想知道是否有比以下更好的方法:

s = "foo"
last_bit = fileObj.readlines()[-10:]
for line in last_bit:
    if line == s:
        print "FOUND"

阅读 150

收藏
2023-07-21

共2个答案

小能豆

# Tail
from __future__ import with_statement

find_str = "FIREFOX"                    # String to find
fname = "g:/autoIt/ActiveWin.log_2"     # File to check

with open(fname, "r") as f:
    f.seek (0, 2)           # Seek @ EOF
    fsize = f.tell()        # Get Size
    f.seek (max (fsize-1024, 0), 0) # Set pos @ last n chars
    lines = f.readlines()       # Read to end

lines = lines[-10:]    # Get last 10 lines

# This returns True if any line is exactly find_str + "\n"
print find_str + "\n" in lines

# If you're searching for a substring
for line in lines:
    if find_str in line:
        print True
        break
2023-07-21
小能豆

你的当前方法对于小文件可能是可以接受的,但是对于大文件来说,读取整个文件的最后几行会导致不必要的内存开销,并且效率较低。为了更快速有效地完成操作,可以使用更高效的方法来搜索文件的最后几行并查找匹配的字符串。

以下是一个更好的方法:

def search_last_lines_for_string(filename, string_to_search, num_lines=10):
    with open(filename, 'r') as file:
        # Move the file pointer to the end of the file
        file.seek(0, 2)
        file_size = file.tell()

        # Start from the end and move backwards to find the newline positions
        lines = []
        newline_count = 0
        for pos in range(file_size - 1, -1, -1):
            file.seek(pos)
            char = file.read(1)
            if char == '\n':
                newline_count += 1
                if newline_count >= num_lines:
                    break

        # Read the last lines into a list
        lines = file.readlines()

    # Search for the string in the last lines
    for line in lines[-num_lines:]:
        if line.strip() == string_to_search:
            print("FOUND")
            return

# Example usage:
search_last_lines_for_string("your_file.txt", "foo", num_lines=10)

这个方法会从文件末尾开始逐个向前搜索换行符的位置,以便定位最后几行。然后,它只读取找到的最后几行,而不是整个文件。这样,无论文件有多大,都能够在内存开销较小的情况下进行搜索。

请注意,在处理大型文件时,性能提升可能会非常显著,特别是当文件非常大时。

2023-07-21