【问题标题】:Python large text file searchingPython大文本文件搜索
【发布时间】:2015-04-08 17:53:50
【问题描述】:

我有一个很久以前制作的 500 MB 文本文件。它具有看起来像 html 或 xml 的标签,但它们在整个文件中并不一致。我正在尝试查找两个不匹配的标签之间的信息。我目前使用的工作但很慢:myDict 中有一个关键字列表。我只能保证 X+key 和 /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]

有没有办法更快地做到这一点?

【问题讨论】:

  • 嗯什么?所以你在寻找&lt;x&gt;some_key some_data_you_might_want_if_key_in_dict&lt;/n&gt;? 500MB 并不是那么大...

标签: python search text


【解决方案1】:

反转您的操作方式,而不是遍历字典并搜索潜在的匹配项。遍历潜在的匹配并搜索字典

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)

因为字典查找是O(1) 而不是O(N) 的字符串查找(为每个键搜索整个文件很昂贵......)

所以搜索你的文件内容是~O(500,000,000),你这样做了 18,000 次

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

【讨论】:

    【解决方案2】:

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

    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
    

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

    【讨论】:

    • 这几乎肯定不是问题...... 500MB 内存并不多
    • 很公平......无论如何这不是一个很好的答案:-)
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多