如何在Python中使用二进制搜索在文本文件中搜索关键字?

10 浏览
0 Comments

如何在Python中使用二进制搜索在文本文件中搜索关键字?

文本文件包含两列-索引号(5个空格)和字符(30个空格)。

它按字典顺序排列。我想使用二分搜索来搜索关键词。

0
0 Comments

如何在Python中使用二分搜索在文本文件中搜索关键字?

问题的出现原因是,有一个需求需要在一个文本文件中搜索特定的关键字。传统的方法是将整个文件加载到内存中,然后逐行搜索关键字,但是这种方法在处理大型文件时可能会导致内存不足的问题。因此,需要一种更高效的方法来实现这个需求。

解决方法是使用Python的内置bisect模块来执行二分搜索。首先,创建一个Query类,用于表示要搜索的关键字,并定义__lt__方法来比较关键字和文件中的记录。然后,创建一个FileSearcher类,用于表示要搜索的文件,并初始化文件指针、记录大小等属性。该类还实现了__len__和__getitem__方法,用于获取文件的大小和指定位置的记录。最后,在主程序中打开要搜索的文件,并使用bisect.bisect函数进行二分搜索,返回关键字在文件中的位置。

这种方法的优点是不需要将整个文件加载到内存中,只需要根据需要读取文件的指定位置,并使用二分搜索算法来快速定位关键字。通过将文件分成较小的块并逐个搜索,可以减少内存的使用,并提高搜索的效率。

代码示例:

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)
if __name__ == '__main__':
    with open('data.dat') as file_to_search:
        query = raw_input('Query: ')
        wrapped_query = Query(query)
        searchable_file = FileSearcher(file_to_search)
        print "Located @ line: ", bisect.bisect(searchable_file, wrapped_query)

通过使用Python的bisect模块和二分搜索算法,可以高效地在文本文件中搜索关键字,而无需将整个文件加载到内存中。这种方法可以提高搜索效率,并节省内存空间。

0
0 Comments

问题的原因是想要在一个文本文件中使用二分搜索来搜索关键字。解决方法是将文本文件转换成一个常量数据库(cdb),然后使用哈希查找来快速找到给定单词的索引。首先,将文本文件转换成cdb格式的常量数据库,然后在另一个脚本中对其进行查询。需要注意的是,CDB不支持大于4GB的文件。如果文件大小小于4GB,可以将其保存在内存中。

0
0 Comments

二进制搜索是一种高效的搜索算法,可以在有序列表中快速定位目标值。在Python中,我们可以使用二进制搜索算法来在文本文件中搜索关键字。下面我们将探讨这个问题的出现原因以及解决方法。

问题出现的原因是我们需要在一个文本文件中搜索关键字。第一个方法是在文件中找到第一个包含关键字的行。我们可以使用一行代码来实现这个目标。首先,我们使用`open()`函数打开文件,然后使用生成器表达式搜索包含关键字的行。如果找到了匹配的行,我们将其赋值给`line_with_keyword`变量,否则将其赋值为`None`。最后,我们检查`line_with_keyword`是否为`None`,如果不是,则打印出找到的行。

如果我们需要找到多个关键字,我们可以使用`set()`来存储关键字。我们定义一个函数`extract_keyword()`来从每一行中提取关键字,并使用生成器表达式将所有的关键字存储在一个集合中。然后,我们可以使用`in`运算符在集合中搜索关键字。

另一种方法是使用`dict()`来存储关键字和索引信息。我们可以使用`bisect`模块中的`bisect_left()`函数来执行二进制搜索。首先,我们使用`open()`函数读取文件的所有行,并将其存储在一个列表中。然后,我们使用`map()`函数将每一行提取的关键字存储在一个新的列表中。接下来,我们使用`bisect_left()`函数在关键字列表中搜索关键字的位置。如果找到了关键字,我们可以使用索引来获取原始文件中的对应行。

需要注意的是,除了第一个方法外,其他方法都需要将整个文件加载到内存中。如果文件很大,这可能会导致内存问题。因此,有一种名为`FileSearcher()`的方法,作者 Abdelkader 提出了一种解决方案,它不需要将整个文件加载到内存中。

通过上述内容,我们了解到了在Python中如何在文本文件中执行二进制搜索来搜索关键字的方法。我们可以根据具体的需求选择合适的方法来实现高效的搜索。

0