각 줄의 알파벳순으로 정렬 된 파일이 있습니다. 파일은 12Gb이며, 이는 단순히 한 행씩 읽을 수는 없다는 것을 의미합니다. 데이터는 다음과 같습니다.bisect를 사용하여 선의 내용을 인쇄 할 수 있습니까?
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"을 리턴해야합니다.
https://docs.python.org/3.0/library/bisect.html 내가 키워드의 행 번호를 알아 내기 위하여 양분 사용하는 게시물을 발견 :
그것은 이것에 대한 좋은 후보가 양분 모듈 될 것으로 보인다 것은 How do I perform binary search on a text file to search a keyword in 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?
그러나 실제로 줄의 내용을 인쇄하는 방법을 알 수는 없습니다. 최소한 어딘가에 진술을 추가해야하지만, 나는 어디 있는지 모른다.
bisect 모듈을 사용하여 선의 내용을 인쇄 할 수 있습니까?
나는 그것이 정보를 당신 '에 따라 (가변 길이 레코드를 가지고 있기 때문에 데이터 파일을 작동합니다'bisect'를 사용하여 참조하는 방법을 생각하지 않는다 귀하의 질문에 제공). 필드가 공백으로 구분되고 각 레코드의 특정 고정 문자 위치를 항상 차지하도록 정의 된 경우 작동합니다. – martineau
다른 단어로 시작하는 줄로 구성된 12GB 파일이 있습니까? – njzk2
코드에서'searchable_file [linepos]'검색 한 행을 인쇄하지 않습니까? – njzk2