我有一个文件,其中每一行都按字母顺序排列。该文件是 12Gb,这意味着我不能简单地逐行读取它。数据如下所示:
brown 0 1 0 1 2
fox 3 5 0 0 1
jumped 2 0 6 1 0
每行开头的单词都是唯一的。每行中的单词和数字由制表符分隔。我希望能够在文件中查询特定关键字。例如,如果我查询“fox”,程序应该返回“fox 3 5 0 0 1”。
似乎 bisect 模块是一个很好的候选者:https ://docs.python.org/3.0/library/bisect.html
我发现了一篇使用 bisect 找出关键字的行号的帖子:如何在文本文件上执行二进制搜索以在 python 中搜索关键字?
这是代码的样子:
import bisect
import os
class Query(object):
def __init__(self, query, index=5):
self.query = query
self.index = index
def __lt__(self, comparable):
return self.query < comparable[self.index:]
class FileSearcher(object):
def __init__(self, file_pointer, record_size=35):
self.file_pointer = file_pointer
self.file_pointer.seek(0, os.SEEK_END)
self.record_size = record_size + len(os.linesep)
self.num_bytes = self.file_pointer.tell()
self.file_size = (self.num_bytes // self.record_size)
def __len__(self):
return self.file_size
def __getitem__(self, item):
self.file_pointer.seek(item * self.record_size)
return self.file_pointer.read(self.record_size)
with open('myfile') as file_to_search:
query = 'fox\t' #token to query
wrapped_query = Query(query)
searchable_file = FileSearcher(file_to_search)
linepos = bisect.bisect(searchable_file, wrapped_query)
print "Located @ line: ", linepos
#print content of line?
但是,我无法弄清楚如何实际打印该行的内容。我至少应该在某处添加一个 read 语句,但我不知道在哪里。
是否可以使用 bisect 模块打印行的内容?