【问题标题】:Finding occurrences of a sub-string in a large file in Python在 Python 中查找大文件中出现的子字符串
【发布时间】:2017-04-20 18:59:38
【问题描述】:

我有一个日志文件,其中每一行的格式如下: 日期 ipaddr 网址状态

2017-03-02  13:02:43  123.123.123.123  /index.html 200
2017-03-02  13:02:46  123.123.123.124  /index.html 200
2017-03-02  13:02:47  123.123.123.125  /about1.html 404
2017-03-02  13:02:49  123.123.123.123  /about.html 200

日志文件有 100 万行,最多有 100 万个唯一 IP 地址。

我有一个查询文件,它是一个 IP 地址列表,每行一个 IP 地址。

123.123.123.123
123.123.123.124
123.123.123.125

我想解析文件和查询文件中的每个 IP,如果在日志文件中看到则打印 1,否则打印 0。

搜索日志文件的最快方法是什么。酸洗会有帮助吗?

【问题讨论】:

  • 查询文件有多大?前三个字段是否保证长度相同(例如,没有错误的空格)?我不确定酸洗在这里如何适用,您有什么想法?
  • 制作一组查询地址;遍历日志文件中的每一行,从行中提取地址;使用in检查行地址是否在查询集中;收集检查结果。
  • 最快的方法是使用miltiprocessing,如果query file 是大BTree 或numpy.array DataFrame。

标签: python parsing search


【解决方案1】:

这样就可以了,一旦找到就会停止搜索:

with open('query.txt', 'r') as q:
    query = {line.strip(): 0 for line in q.readlines()}
with open('log.txt', 'r') as l:
    for line in l:
        check = line.split()[2]
        if check in query:
            query[check] = 1
        if sum(query.values()) == len(query):
            break
for k, v in query.items():
    print k, v

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2011-04-21
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多