Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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_Search_Text - Fatal编程技术网

Python大型文本文件搜索

Python大型文本文件搜索,python,search,text,Python,Search,Text,我有一个500 MB的文本文件,是很久以前制作的。它具有类似于html或xml标记的内容,但它们在整个文件中并不一致。我试图在两个不匹配的标记之间查找信息。我现在使用的东西很有效,但速度很慢:myDict有一个关键字列表。我只能保证X+键和/N存在。没有其他一致的标记。这本字典有18000把钥匙 for key in myDict: start_position = 0 start_position = the_whole_file.find('<X>'+key,

我有一个500 MB的文本文件,是很久以前制作的。它具有类似于html或xml标记的内容,但它们在整个文件中并不一致。我试图在两个不匹配的标记之间查找信息。我现在使用的东西很有效,但速度很慢:myDict有一个关键字列表。我只能保证X+键和/N存在。没有其他一致的标记。这本字典有18000把钥匙

for key in myDict:
    start_position = 0

    start_position = the_whole_file.find('<X>'+key, start_position)

    end_position = the_whole_file.find('</N>', start_position)

    date =  the_whole_file[start_position:end_position]
myDict中的键的
:
起始位置=0
开始位置=整个文件。查找(“”+键,开始位置)
结束位置=整个文件。查找(“”,开始位置)
日期=整个文件[开始位置:结束位置]

有什么方法可以更快地完成这项工作吗?

与您现在的做法相反,而不是反复浏览字典并搜索可能的匹配项。遍历可能的匹配项并搜索字典

import re
for part in re.findall("\<X\>(.*)\<\/N\>",the_whole_text):
    key = part.split(" ",1)[0]
    if key in my_dict:
       do_something(part)
重新导入
对于re.findall中的部分(“\(.*)\”,全文):
键=部分拆分(“,1)[0]
如果输入my_dict:
做某事(部分)
因为字典查找是
O(1)
,而不是
O(N)
的字符串查找(在整个文件中搜索每个键是昂贵的…)

因此,搜索文件内容是
~O(500000000)
,而您正在这样做18000次


这样,您只需搜索一次文件,就可以找到所有潜在的。。。然后查找每个文件,查看其是否在数据字典中

始终可以逐行读取文件,而不是将整个文件存储在内存中:

import re
for part in re.findall("\<X\>(.*)\<\/N\>",the_whole_text):
    key = part.split(" ",1)[0]
    if key in my_dict:
       do_something(part)
inside_tag = False
data = ''
with open(your file, 'r') as fil:
    for line in fil:
        if '</N>' in line:
            data += line.split('<X>')[0]
            print data
            inside_tag = False
        if inside_tag:
            data += line
        if '<X>' in line:
            data = line.split('<X>')[-1]
            inside_tag = True
内部标签=False
数据=“”
以文件形式打开(您的文件“r”):
对于fil中的行:
如果“”在第行中:
数据+=行分割(“”)[0]
打印数据
内部标签=假
如果在标签内:
数据+=行
如果“”在第行中:
数据=行分割(“”)[-1]
内部标记=真

请注意,当开始和结束标记位于同一行时,这不起作用。

hmmm什么?所以你在寻找一些你可能想要的数据,如果你在dict中输入?500MB没有那么大…这几乎肯定不是问题。。。500MB不够公平。。。无论如何,这不是一个很好的答案:-)