Упорядочить текстовый файл
Есть текстовый файл с таким содержимым:
template1
111:222222222
template2
222:222222224
template1
111:222222222
template1
222:333333333
template2
222:555555555
template3
225:222222224
Нужно его привести в такой вид:
template1
111:222222222
111:222222222
222:333333333
template2
222:222222224
222:555555555
template3
225:222222224
Обратите внимание, что template отсортированы по имени. Названия template условные, тут может быть любая строка. Задача в том, чтобы объединить одинаковые строки с тем, что идет после них. В строках 225:222222224 всегда есть знак ":" (если это поможет).
Попробовал набросать такой код:
with open('1.txt') as file_with_data:
list_data = file_with_data.readlines()
list_data = list(filter(None, [line.rstrip() for line in list_data]))
list_token_template = sorted(list(set(x for x in list_data if ':' not in x)))
Получил 2 списка:
['template1', 'template2', 'template3']
['template1', '111:222222222', 'template2', '222:222222224', 'template1', '111:222222222', 'template1', '222:333333333', 'template2', '222:555555555', 'template3', '225:222222224']
А дальше не придумал, как быть. Помогите решить задачу.
Ответы (4 шт):
from pprint import pprint
with open('file.txt') as f:
data = f.readlines()
result = {}
for index in range(0, len(data), 3):
key = data[index].replace('\n', '')
if not key in result:
result[key] = []
result[key].append(data[index + 1].replace('\n', ''))
pprint(result)
# {'template1': ['111:222222222', '111:222222222', '222:333333333'],
# 'template2': ['222:222222224', '222:555555555'],
# 'template3': ['225:222222224']}
Я уверен, что есть более органичное решение вашей задачи, но для такого я бы однозначно написал очень простенький парсер.
data="""template2
228:1337
template1
63337:20012
template1
1337:228
template2
26349684:2147483647
template3
99999999:11111111"""
lines=data.split('\n')
""" $result, dict - результат программы формата {name: {key:value, ..}, ..}.
$name, str - последнее объявленное name.
"""
result =dict()
name =str()
for line in lines:
if line.isspace() or line == '':
""" Это пустая линия без информации.
"""
continue
""" Добираемся до значимой части,
убирая пустые отступы по бокам.
То есть " ЯЗНАЧИМ " превратится в "ЯЗНАЧИМ".
"""
word=line.strip()
""" По первому значащему символу определим:
данная строка содержит имя или конструкцию key:value.
"""
keychar=word[0]
if keychar.isdigit():
""" Это конструкция key:value,
которая принадлежит предыдущему объявленному имени.
"""
if name == '':
""" Ничейных не должно быть.
"""
raise SyntaxError("Not declared name for first.")
(key, value)=word.split(':')
result[name][key]=value
else:
""" Это имя.
"""
name=word
if not name in result.keys():
result[name]=dict()
print(data, f"\n{'-'*12}\nConverted to\n", result)
iterator
res = {}
with open('file.txt') as f:
text = filter(bool, map(str.rstrip, f))
for key in text:
try: val = next(text)
except StopIteration: break
else:
try: res[key].append(val)
except KeyError: res[key] = [val]
print(res) # {'template1': ['111:222222222', '111:222222222', '222:333333333'], 'template2': ['222:222222224', '222:555555555'], 'template3': ['225:222222224']}
list
res = {}
with open('file.txt') as f:
text = list(filter(bool, map(str.rstrip, f)))
for key, val in zip(text[::2], text[1::2]):
res.setdefault(key, []).append(val)
print(res) # {'template1': ['111:222222222', '111:222222222', '222:333333333'], 'template2': ['222:222222224', '222:555555555'], 'template3': ['225:222222224']}
А дальше не придумал, как быть. Помогите решить задачу.
Всё просто, вот у Вас есть два списка:
a = ['template1', '111:222222222', 'template2', '222:222222224', 'template1', '111:222222222', 'template1', '222:333333333', 'template2', '222:555555555', 'template3', '225:222222224']
b = ['template1', 'template2', 'template3']
Теперь смотрим дальше, то что Вы хотите получить на выходе больше всего напоминает структуру данных - словарь:
d = {}
Заполним его ключами (template1, temp...), а в качестве значений укажем пустые списки:
for i in b: d[i] = []
А теперь пройдёмся по списку и распределим значения по ключам:
for i in range(0, len(a) - 1):
if a[i] in d.keys():
d[a[i]].append(a[i+1])
В итоге имеем:
a = ['template1', '111:222222222', 'template2', '222:222222224', 'template1', '111:222222222', 'template1', '222:333333333', 'template2', '222:555555555', 'template3', '225:222222224']
b = ['template1', 'template2', 'template3']
d = {}
for i in b: d[i] = []
for i in range(0, len(a) - 1):
if a[i] in d.keys():
d[a[i]].append(a[i+1])
print(d)
#{'template1': ['111:222222222', '111:222222222', '222:333333333'], 'template2': ['222:222222224', '222:555555555'], 'template3': ['225:222222224']}