您可以使用mmap
内置模块。它提供对文件的随机访问(即,文件的行为类似于存储在文件系统中的大型字节数组)。你可以在这里找到更多信息。
import mmap
def bisect_search(file_path, line):
line = line.encode()
with open(file_path, 'r+b') as f:
mm = mmap.mmap(f.fileno(), 0)
lo = 0
hi = mm.size()
while lo < hi:
mid = (lo + hi) // 2
left_endl_idx = mm.rfind(b'\n', lo, mid)
right_endl_idx = mm.find(b'\n', mid, hi)
if left_endl_idx == -1:
left_endl_idx = lo - 1
if right_endl_idx == -1:
right_endl_idx = hi
mid_line = mm[left_endl_idx + 1: right_endl_idx]
if mid_line == line:
return True
if mid_line < line:
lo = right_endl_idx + 1
else:
hi = left_endl_idx
return False
True
如果line
文件中存在,则该函数返回,False
否则返回。让我们使用以下myfile.txt
文件运行几个示例:
aaaaa
bcijkjf
dfsdf
gdfgdfhqiuzhf
zzdiszfhj
>>> bisect_search('myfile.txt', 'hello')
False
>>> bisect_search('myfile.txt', 'aaaaa')
True
>>> bisect_search('myfile.txt', 'aaaa')
False
>>> bisect_search('myfile.txt', 'dfsdf')
True
>>> bisect_search('myfile.txt', 'zzdiszfhjj')
False
这个函数应该比对大文件的线性搜索要快得多。
注意:此代码适用于\n
结尾,目前不适用于\r\n
Windows 风格的结尾(对于 OP 不是必需的)。