【问题标题】:Searching a string from a file - python从文件中搜索字符串 - python
【发布时间】:2012-09-09 08:19:27
【问题描述】:

我有一个在eng.dic 中看起来像这样的人类字典文件(该列表中有接近十亿 个单词的图像)。而且我必须经常运行不同的单词查询。

apple
pear
foo
bar
foo bar
dictionary
sentence

我有一个字符串,比如说“foo-bar”,有没有更好(更有效的方法)搜索该文件以查看它是否存在,如果它返回存在,如果它不存在,则附加字典文件

dic_file = open('en_dic', 'ra', 'utf8')
query = "foo-bar"
wordlist = list(dic_file.readlines().replace(" ","-"))
en_dic = map(str.strip, wordlist)

if query in en_dic:
    return 1
else:
    print>>dic_file, query

python 中有内置的搜索功能吗?或任何我可以导入以运行此类搜索而无需太多开销的库?

【问题讨论】:

  • 如果你只用一个词来做这件事,我怀疑你是否能比现有的实现做得更好。但是,如果您要循环并多次执行此功能,您可能会以一种允许更有效查找的方式存储字符串。一个非常简单的例子是保持列表排序。
  • 十亿字?真的吗?您将用完大约一百万个英语单词..
  • @wim,不正确。将“foo”视为 1 个单词,将“bar”视为 1 个单词,将“foo bar”视为不同的单词。所以单词列表在某种意义上几乎是无限的,但仅限于我拥有的数据输入,目前它有十亿个单词的语料库,所以我列出了最坏的情况。
  • 你能改变表示吗?一个shelve,或者sqlite3 数据库?
  • @2er0:重点是问题,虽然看起来不同,但非常相似(我什至会说他的问题更复杂,但要解决您的问题,您需要使用与一个基地)。除非您知道自己在做什么,否则每次您想检查是否存在某事时都浏览该文件并不是一个好主意。如果您将其存储在数据库中,您将获得更加灵活和高效的解决方案(这也将存储在文件中,但您将能够使用 SQLite 高效机制)。只需索引文件并使用数据库进行检查。

标签: python file search dictionary string-search


【解决方案1】:

最有效的方法取决于您将使用此字典执行的最频繁操作。

如果您每次都需要读取文件,您可以使用while 循环逐行读取文件,直到结果是文件末尾的单词。如果您有多个可以同时更新文件的并发工作人员,这是必要的。

如果您不需要每次都读取文件(例如,您只有一个使用字典的进程),您绝对可以编写更高效的实现:1)将所有行读入set(而不是@987654323 @), 2) 对每个“新”单词执行两个操作 - 使用 add 操作更新 set 并将单词写入文件。

【讨论】:

    【解决方案2】:

    如果是“相当大”的文件,则按顺序访问这些行,不要将整个文件读入内存:

    with open('largeFile', 'r') as inF:
     for line in inF:
        if 'myString' in line:
            # do_something
    

    【讨论】:

    • 但是我必须经常访问字典,所以顺序搜索肯定是不可能的。
    【解决方案3】:

    正如我已经提到的,当文件的大小很大时遍历整个文件并不是一个好主意。相反,您应该使用已建立的解决方案并且:

    1. 索引文档中的单词,
    2. 以适当的形式存储索引结果(我建议使用数据库),
    3. 检查文件中是否存在单词(通过检查数据库),
    4. 如果不存在,将其添加到文件和数据库中,

    在数据库中存储数据确实比尝试重新发明轮子更有效。如果你使用 SQLite,数据库也是一个文件,所以设置过程是最小的。

    因此,我再次建议将单词存储在 SQLite 数据库中,并在您想要检查该单词是否存在于文件中时进行查询,然后在添加时更新它

    要了解有关解决方案的更多信息,请参阅此问题的答案:

    The most efficient way to index words in a document

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多