2014-12-08 2 views
0

У меня есть сценарий, от которого я получаю выход (я также сохранить этот вывод в файл в f1 = 20141202.194812_carStatus /):питона чтение блоков строк из файла

--------------------------------------------- 
TM 05120970.01: Processing... 
TM 05120970: Processing... 
TM 05120970: current status Open 
TM 05120970: Owner_Info.User_ref = crossi14 
TM 05120970: Owner_Info.Email = [email protected] 
TM 05120970: CarModel = Nissan Micra 
---------------------------------------------- 
TM 05157414.06: Processing... 
TM 05157414: Processing... 
TM 05157414: current status Open 
TM 05157414: Owner_Info.User_ref = yumiao12 
TM 05157414: Owner_Info.Email = [email protected] 
TM 05157414: CarModel = Toyota Avensis 
---------------------------------------------- 

я использовал: exec_cmd('cat ' + f1 + '| grep -e "CarModel = " -e "Owner_Info.User_ref = "') но я также нуждаются в первой строке (на самом деле второй) блока

TM 05157414.06: Processing... 

то, что я стараюсь/нужно сделать, это, анализировать и и получить значения в переменной для каждого из этих блоков:

TM 05120970.01 -> car_number = 05120970.01 

Owner_Info.User_ref = crossi14 -> owner_user = crossi14 

CarModel = Nissan Micra -> car_model = Nissan Micra 

с этой информацией я добавлю некоторые стандартные вещи, как:

priority = Unknown 

и мне нужно будет иметь эти переменные в качестве входных данных для другой сценарий под названием insert_owner_car.pl

insert_owner_car.pl -id 05120970.01 -o owner_user="crossi14",car_model="Nissan Micra",priority="Unknown" 

это то, что я до сих пор не удается, но он не может использоваться, поскольку я не могу получить указанные значения.

#!/usr/bin/python 

import itertools, commands, datetime, os, re, sys, time 

inFile = open("/tmp/20141202.194812_carStatus") 
outFile = open("result.txt", "w") 
keepCurrentSet = False 
for line in inFile: 
    if line.startswith("----------------------------------------------"): 
     keepCurrentSet = False 
    if keepCurrentSet: 
     parts = line.split(" = ")[1:] 
     part=','.join(parts) 
     print part 
#outFile.write(parts) 
    if line.startswith("----------------------------------------------"): 
     keepCurrentSet = True 
inFile.close() 
outFile.close() 

i dont знаете, как получить: 05120970,01 и как иметь все переменные из одного блока, чтобы иметь возможность использовать их в качестве входных данных для этого другого сценария

PS: У меня есть питон 2.5.1

ответ

0

Вы должны использовать модуль re для извлечения соответствующей информации: он является стандартным, простым и надежным. Вы также можете отобразить информацию о блоке на пределе блока и добавить catch в конец файла.

Сценарий будет:

import re 

rnum = re.compile('\s*TM\s+([^\s:]+):.*') 
ruser = re.compile('.*Owner_Info.User_ref\s*=\s*(.*)') 
rmodel = re.compile('.*CarModel\s*=\s*(.*)') 


def display(out, num, user, model): 
    print(num, user, model) 
    out.write('insert_owner_car.pl -id %s -o owner_user="%s",car_model="%s",priority="Unknown"\n' % (num, user, model)) 

inFile = open("/tmp/20141202.194812_carStatus") 
outFile = open("result.txt", "w") 
firstOfBlock = False 
carnum = None 
for line in inFile: 
    if line.startswith("--------------------------------"): 
     firstOfBlock = True 
     if carnum is not None: 
      display(outFile, carnum, user, model) 
      carnum = None 
    else: 
     if firstOfBlock: 
      m = rnum.match(line) 
      if m is not None: 
       carnum = m.group(1) 
       firstOfBlock = False 
     else: 
      line = line.strip() 
      m = ruser.match(line) 
      if m is not None: 
       user = m.group(1) 
      else: 
       m = rmodel.match(line) 
       if m is not None: 
        model = m.group(1) 

if carnum is not None: 
    display(outFile, carnum, user, model) 
    carnum = None 

inFile.close() 
outFile.close() 

С текущего примера, выход

05120970.01 crossi14 Nissan Micra 
05157414.06 yumiao12 Toyota Avensis 

и result.txt является:

insert_owner_car.pl -id 05120970.01 -o owner_user="crossi14",car_model="Nissan Micra",priority="Unknown" 
insert_owner_car.pl -id 05157414.06 -o owner_user="yumiao12",car_model="Toyota Avensis",priority="Unknown" 
+0

$ ./test11.py Traceback (последний звонок последний): Файл «./test11.py», строка 25, in? carnum = m.group (1) AttributeError: объект «NoneType» не имеет атрибута «group» –

+0

@KayNix: извините, я сделал плохую копию и вставлял. Исправлено: –

+0

спасибо, это сработало: D теперь я хочу, чтобы он использовал диктатор и сгруппировал каркасы в роскошные, компактные, маленькие ... но плохо с этим справиться, если я не могу справиться: D –

0

Вы можете использовать utility function open_chunk для обработки файла в кусках:

import re 
import subprocess 

def open_chunk(readfunc, delimiter, chunksize=1024): 
    """ 
    readfunc(chunksize) should return a string. 
    """ 
    remainder = '' 
    for chunk in iter(lambda: readfunc(chunksize), ''): 
     pieces = re.split(delimiter, remainder + chunk) 
     for piece in pieces[:-1]: 
      yield piece 
     remainder = pieces[-1] 
    if remainder: 
     yield remainder 

f = open(filename, 'r') 
for chunk in open_chunk(f.read, delimiter=r'-{45,}'): 
    chunk = chunk.strip() 
    if chunk: 
     lines = chunk.splitlines() 
     firstline = lines[0] 
     car_number = firstline.split()[1][:-1] 
     for line in lines[1:]: 
      if 'Owner_Info.User_ref = ' in line: 
       owner_user = line.split(" = ")[1] 
      elif 'CarModel = ' in line: 
       car_model = line.split(" = ")[1] 
     cmd = ['insert_owner_car.pl' 
       , '-id' 
       , car_number 
       , '-o' 
       , 'owner_user="%s"' % (owner_user,) 
       , 'car_model="%s"' % (car_model,) 
       , 'priority="Unknown"'] 
     print(' '.join(cmd)) 
     # subprocess.call(cmd) 
f.close() 

отпечатки

insert_owner_car.pl -id 05120970.01 -o owner_user="crossi14" car_model="Nissan Micra" priority="Unknown" 
insert_owner_car.pl -id 05157414.06 -o owner_user="yumiao12" car_model="Toyota Avensis" priority="Unknown" 

Если файл данных мал, то вы могли бы хлебать весь файл в строку, а затем использовать re.split, чтобы разбить его на куски:

In [37]: import re 

In [38]: re.split(r'-{45,}', open('data').read()) 
Out[38]: 
['\n\n', 
'\nTM 05120970.01: Processing...\nTM 05120970: Processing...\nTM 05120970: current status Open\nTM 05120970: Owner_Info.User_ref = crossi14\nTM 05120970: Owner_Info.Email = [email protected]\nTM 05120970: CarModel = Nissan Micra\n', 
'\nTM 05157414.06: Processing...\nTM 05157414: Processing...\nTM 05157414: current status Open\nTM 05157414: Owner_Info.User_ref = yumiao12\nTM 05157414: Owner_Info.Email = [email protected]\nTM 05157414: CarModel = Toyota Avensis\n', 
'\n'] 

Это может быть использован вместо open_chunk выше. Преимущество использования open_chunk состоит в том, что его можно использовать в очень больших файлах, когда выкладывание всего файла в строку и разбиение его на список требует слишком большого объема памяти.

+0

выглядит хорошо, но я не могу шва иметь возможность использовать открытую вещь ... Файл «./test8.py ", строка 20 с открытым ('data_file/tmp/20141202.194812_carStatus') как f: ^^ SyntaxError: недействительный синтаксис –

+0

О, я забыл, что вы используете Python2.5. Чтобы использовать' with statement', вам нужно добавить ['из __future__ import with_statement'] (https://docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement) в начало кода. Вот [ объяснение с-заявление] (http://effbot.org/zone/python-with-statement.htm) – unutbu

+0

да, его все еще не работает, я сделал:. из __future__ импорта with_statement импорта повторно импорт подпроцесса import six –

Смежные вопросы