我有一个文件,但我不知道它有多大(它可能很大,但大小会有很大差异)。我想搜索最后 10 行左右,看看其中是否有任何一个与字符串匹配。我需要尽可能快速有效地完成此操作,并且想知道是否有比以下更好的方法:
s = "foo" last_bit = fileObj.readlines()[-10:] for line in last_bit: if line == s: print "FOUND"
# 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
你的当前方法对于小文件可能是可以接受的,但是对于大文件来说,读取整个文件的最后几行会导致不必要的内存开销,并且效率较低。为了更快速有效地完成操作,可以使用更高效的方法来搜索文件的最后几行并查找匹配的字符串。
以下是一个更好的方法:
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)
这个方法会从文件末尾开始逐个向前搜索换行符的位置,以便定位最后几行。然后,它只读取找到的最后几行,而不是整个文件。这样,无论文件有多大,都能够在内存开销较小的情况下进行搜索。
请注意,在处理大型文件时,性能提升可能会非常显著,特别是当文件非常大时。