Я согласен с @ jan-steinman, что вы должны использовать базу данных для такого рода задач. Есть много способов собрать воедино решение с помощью сценария оболочки, как показывают другие ответы, но выполнение этого способа приведет к большим страданиям, если вы собираетесь использовать и поддерживать код в течение любого промежутка времени больше, чем просто однодневный одноразовый проект.
Предполагая, что вы используете Linux, у вас, скорее всего, установлен Python по умолчанию, который включает библиотеку sqlite3, начиная с Python v2.5. Вы можете проверить свою версию Python с:
% python -V
Python 2.7.2+
Я рекомендую использовать библиотеку sqlite3, потому что это простое файловое решение, которое существует для всех платформ (в том числе внутри вашего веб-браузера!) И не требует установки сервера. По сути, нулевая конфигурация и нулевое обслуживание.
Ниже приведен простой скрипт на python, который будет анализировать формат файла, который вы указали в качестве примера, а затем выполняет простой запрос «выбрать все» и выводит все данные, хранящиеся в БД.
#!/usr/bin/env python
import sqlite3
import sys
dbname = '/tmp/simple.db'
filename = '/tmp/input.txt'
with sqlite3.connect(dbname) as conn:
conn.execute('''create table if not exists people (key integer primary key, name text, job text)''')
with open(filename) as f:
for key in f:
key = key.strip()
name = f.next().strip()
job = f.next().strip()
try:
conn.execute('''insert into people values (?,?,?)''', (key, name, job))
except sqlite3.IntegrityError:
sys.stderr.write('record already exists: %s, %s, %s\n' % (key, name, job))
cur = conn.cursor()
# get all people
cur.execute('''select * from people''')
for row in cur:
print row
# get just two specific people
person_list = [1358726575123, 9973834728345]
cur.execute('''select * from people where key in (?,?)''', person_list)
for row in cur:
print row
# a more general way to get however many people are in the list
person_list = [1358726575123, 9973834728345]
template = ','.join(['?'] * len(person_list))
cur.execute('''select * from people where key in (%s)''' % (template), person_list)
for row in cur:
print row
Да, это означает, что вам нужно изучить некоторый SQL , но в конечном итоге это того стоит. Кроме того, вместо анализа ваших файлов журнала, возможно, вы могли бы записать данные непосредственно в базу данных sqlite.