2015-03-09 12 views
0

У меня есть файл, подобный этому, я хочу отсортировать его по строке, заключенной в {}, но мне нужно сохранить набор из трех строк вместе.Группировка строк в файле

bot_out_c_dn_l_za 
meta{c_4x8__end} (bot_lq_b_c_dn_l1_za), 
meta{c_4x8_end} (bot_lq_b_c_dn_l0_za); 
bot_out_c_dn_l_za 
meta{c_4x8_gps} (bot_rq_b_c_dn_l1_za), 
bot_out__c_dn_r_za 
meta{c_4x8_end} (bot_lq_b_c_dn_r1_), 
meta{c_4x8_end} (bot_lq_b_c_dn_r0_); 

Я думал разбор файла, ищет полуколоннами, вступив в 3 строки в одну строку, а затем разделив строку на kyeword мета и его сортировку по ключевому слову.

Когда я пытаюсь конкатенации, это дает мне error-

listoflines={} 
i=0 
for line in file: 
    if ";" in line: 
     listoflines[i]+=line 
     i=i+1 
    else: 
     listoflines[i]+=line 

Ошибка - IndexError: Список форумов вне диапазона Случается при первом индексе (I = 0).

+0

какой мощность вы ожидаете? –

+0

Спасибо, моя проблема была решена – Illusionist

ответ

1

Описание wing создает список строк в указанном порядке.

import re 
import itertools 

lines = f.readlines() 
order = [x[0] for x in sorted(enumerate(lines[1::3]), key=lambda x: re.match('.*\{(.*)\}.*', x[1]).groups()[0])] 
sorted_lines = list(itertools.chain(*[lines[i*3: (i+1)*3] for i in order])) 
+0

Thank вы Alex! – Illusionist

+0

Я хочу написать каждую группу в свой собственный файл, как мне найти, где изменяется группа данных отсортированных строк/заказов? – Illusionist

+0

Вы имеете в виду группы из 3, или вы рассматриваете все группы из 3, которые имеют одинаковые ключ для группы? – Alex

2

вы должны убедиться, что вы деталь существует в словаре, прежде чем вы можете добавить к нему

listoflines={} 
i=0 
for line in file: 
    if ";" in line: 
     try: 
      listoflines[i]+=line 
     except IndexError: 
      listoflines[i]=line 
     i=i+1   
    else: 
     try: 
      listoflines[i]+=line 
     except IndexError: 
      listoflines[i] = line    

вы также можете сократить этот значительно

listoflines={} 
i=0 
for line in file: 
    try: 
     listoflines[i]+=line 
    except IndexError: 
     listoflines[i]=line 
    if ";" in line: 
     i = i + 1 

или с помощью defaultdict

from collections import defaultdict 
listoflines=defaultdict(str) 
i=0 
for line in file: 
    listoflines[i]+=line 
    if ";" in line: 
     i = i + 1 
+1

Вместо второй альтернативы я предпочел бы использовать ['defaultdict (str)'] (https://docs.python.org/2/library/collections.html#collections.defaultdict) - с тем, что исходный код OPs практически не изменится. –

+0

yeah ok ... edit incomming ... может быть труднее для нового пользователя –

+0

Спасибо большое Joran – Illusionist

1
lines = open("temp.txt","r").readlines() 
triples = zip(lines[0::3],lines[1::3],lines[2::3]) 
sorted_lines = map(lambda x: "".join(x), sorted(triples, key=lambda x: x[1])) 
print("".join(sorted_lines)) 
+0

Это не сортировка по тексту, содержащемуся в фигурных скобках. – Alex

+0

спасибо, сортирует ли лямбда-функцию по первому элементу? Я хочу, чтобы он сортировал по ключевому слову после {}, sjhould я делал что-то вроде map (lambda x: "" .join (x), отсортировано (троек, key = lambda x: x [2] .split (("{")) [1]) – Illusionist

+0

Вы можете просто сортировать по второй из каждой тройки из-за структуры состояния входного файла. Помните, что строки сравниваются лексикографически. Если описание проблемы не вводит в заблуждение, предлагаемый вид должен быть правильным. – Alan

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