Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从文件中搜索字符串-python_Python_File_Search_Dictionary_String Search - Fatal编程技术网

从文件中搜索字符串-python

从文件中搜索字符串-python,python,file,search,dictionary,string-search,Python,File,Search,Dictionary,String Search,我在eng.dic中有一个类似于此的人类词典文件(该列表中有将近十亿个单词)。我必须经常运行不同的单词查询 apple pear foo bar foo bar dictionary sentence 我有一个字符串,比如“foobar”,有没有更好(更有效的方法)搜索该文件以查看它是否存在,如果它返回exist,如果它不存在,则附加字典文件 dic_file = open('en_dic', 'ra', 'utf8') query = "foo-bar" wordlist = list(di

我在
eng.dic
中有一个类似于此的人类词典文件(该列表中有将近十亿个单词)。我必须经常运行不同的单词查询

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

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中有内置的搜索函数吗?或者我可以导入任何库来运行这样的搜索,而不会产生太多开销

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

若每次都需要读取文件,可以使用
,而
逐行循环读取文件,直到结果是文件末尾的字。如果您有多个可以同时更新文件的并发工作程序,则这是必需的

如果您不需要每次都读取文件(例如,您只有一个处理字典的进程),那么您肯定可以编写更高效的实现:1)将所有行读取到
集合中(而不是
列表中),2)每个“新”word执行这两个操作-使用
添加
操作更新
设置
并将word写入文件。

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

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

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

  • 为文档中的单词编制索引
  • 以适当的形式存储索引结果(我建议使用数据库)
  • 检查文件中是否存在该单词(通过检查数据库)
  • 如果不存在,则将其添加到文件和数据库中
  • 在数据库中存储数据确实比试图重新发明轮子要有效得多。如果您将使用SQLite,那么数据库也将是一个文件,因此安装过程非常简单

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

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


    我怀疑,如果你只用一个词就能做到这一点,那么你是否能够比现有的实现做得更好。但是,如果要多次循环并执行此函数,则可以以允许更高效查找的方式存储字符串。一个非常简单的例子就是保持列表的排序。十亿字?真正地你会在一百万左右用完英语单词。@wim,不是真的。把“Fo”作为1个单词,把“bar”作为1个单词,把“Fobar”作为一个不同的单词。从某种意义上说,单词列表是无限的,但仅限于我输入的数据,目前有十亿单词的语料库,所以我列出了最糟糕的情况。你能改变表示吗?可能是
    搁置
    ,或者是
    sqlite3
    数据库?@2er0:问题的关键是,尽管看起来不同,但非常相似(我甚至会说他的问题更复杂,但要解决您的问题,您需要使用相同的解决方案作为基础)。如果你不知道自己在做什么,那么每次你想检查某件事情是否存在的时候都要检查一下文件不是一个好主意。如果将其存储在数据库中,您将获得更灵活、更高效的解决方案(这也将存储在文件中,但您将能够使用SQLite高效机制)。只需为文件编制索引并使用数据库进行检查。但我必须经常访问字典,因此顺序搜索肯定是不可能的。