2016-09-07 3 views
1

У меня есть файлы журналов длиной около 20000-30000 строк, они содержат все виды данных, каждую строку, начиная с текущей отметки времени, а затем путь к файлам/номерам linu, а затем ценность добавленных объектов с некоторой дополнительной (ненужной информацией).Python: извлечение шаблона из stdout и сохранение в csv

2016/08/31 17:27:43/usr/log/data/old/objec: 540: Adjustment Stat 
2016/08/31 17:27:43/usr/log/data/old/objec: 570: Position: 1 
2016/08/31 17:27:43/usr/log/data/old/object::1150: Adding new object in department xxxx 
2016/08/31 17:27:43/usr/log/data/old/file1.java:: 728: object ID: 0 
2016/08/31 17:27:43/usr/log/data/old/file2.java:: 729: Start location:1 
2016/08/31 17:27:43/usr/log/data/old/file1.java:: 730: End location:55 
2016/08/31 17:27:43/usr/log/data/old/: 728: object ID: 1 
2016/08/31 17:27:43/usr/log/data/old/: 729: Start location:56 
2016/08/31 17:27:43/usr/log/data/old/: 730: End location:67 
2016/08/31 17:27:43/usr/log/data/old/: 728: object ID: 2 
2016/08/31 17:27:43/usr/log/data/old/: 729: Start location:68 
2016/08/31 17:27:43/usr/log/data/old/: 730: End location:110 
Timer to Calculate location of object x took 0.004935 seconds 

.... ... ... же информация ... для нового объекта Есть 30-40 групп объектов в файл и они изменяются (между ID 0-3)

I want to extract information (next line after Adjustment Stat)and save in a text file like 
Position ObjectID StartLocation EndLocation 
      0    1    55 
      1    56    67 
      2    68    110 

... ... ...

(здесь нет какой-либо объект с идентификатором 0) ...

Or may be store in csv file like 
    0,1,55 
    1,56,67 
    2,68,110 

ответ

3
import csv 

with open('out.csv', 'w') as output_file, open('in.txt') as input_file: 
    writer = csv.writer(output_file) 
    for l in input_file: 
     if 'object ID:' in l: 
      object_id = l.split(':')[-1].strip() 
     elif 'Start location:' in l: 
      start_loc = l.split(':')[-1].strip() 
     elif 'End location:' in l: 
      end_loc = l.split(':')[-1].strip() 
      writer.writerow((object_id, start_loc, end_loc)) 


2,6 версия:

import csv 
import contextlib 

with contextlib.nested(open('out.csv', 'w'), open('in.txt')) as (output_file, input_file): 
    writer = csv.writer(output_file) 
    for l in input_file: 
     if 'object ID:' in l: 
      object_id = l.split(':')[-1].strip() 
     elif 'Start location:' in l: 
      start_loc = l.split(':')[-1].strip() 
     elif 'End location:' in l: 
      end_loc = l.split(':')[-1].strip() 
      writer.writerow((object_id, start_loc, end_loc)) 

out.csv (in.txt как в ОП)

0,1,55 
1,56,67 
2,68,110 
+0

логика хорошо очень хорошо, только вопрос не работает с моим olddd python (2.6) ... работа над преобразованием в старый python. Спасибо. – Naumann

+0

встроенные менеджеры контекстного контекстного меню были введены в 2.7 - попробуйте отредактированную версию 2.6. –

+0

Awesome ... Спасибо Крейг, отлично работает с 2.6, а главное, так это то, как вы использовали contextlib.nested ... Это поможет решить многие другие мои проблемы. – Naumann