doza_and
Да, красивых решений тут похоже не получится.
Да я не думаю, что тут надо дерево строить. Можно всё сделать, построив просто плоскую структуру. Плоскую структуру с вложенной плоской структурой. Очень всё просто получится. Просто
xam1816'у не хватит опыта. По задаче с выписками из ЕГРН это видно.
doza_and
Из постановки задачи непонятно почему ТС не может это ручками один раз сделать.
Наверное, вероятность того, что он не может это делать руками, высокая. Видимо, он делает это много раз или просто часто.
Да я и сам делал такое. А связано это было с тем, что при обновлении софта или переустановке все старые настройки стирались и становились дефолтными и надо было заново всё настраивать и писать везде. Так вот лучше это всё делать скриптом за секунду, чем сидеть полдня и перепроверять, всё ли правильно отредактировано уже в десятый раз по одному кругу.
doza_and
1 Нумерацию сдвинуть легко регулярными выражениями, если в качестве замены подать функцию.
Дело в том, что завтра он скажет, что ему надо теперь блоки в середину вставлять. И тут-то простой сдвиг нумерации превратится в тыкву. Придётся тогда заново всё писать и делать уже всё по-нормальному. Так вот нумерацию можно проводить любым образом тогда, когда у тебя есть что нумеровать в виде такого составного объекта, состоящего из объектов, и над этим объектом можно построить путём расширения разные операции. Составной объект, который состоит из маленьких объектов. Так вот на этом составном объекте можно добавить его операцию перенумерации, которая при выполнении итеративно запускает у каждого маленького объекта его личную перенумерацию самого себя.
doza_and
Если регулярками понавставлять двоеточий и запятых то из скобок получится или json
Да соблазн такой есть. Но это мнимое спасение. Оно сильно исказит исходный файл. Оно может табуляцию, например, заменить на пробелы или вообще стереть всё нафиг, превратив в одну строку весь файл. И тут-то вдруг и окажется, что этот Counter Strike не может понять этот файл, потому что ждёт там блоками всё и с табуляциями. Ну, или там просто всё это станет нечитаемым человеком, а нужно, чтобы оно было читаемым и меняемым руками в том числе - чтобы
и скриптом можно было всё поменять,
и руками.
Тут я набросал пример
>>> import re
>>>
>>> class Document:
... def __init__(self, header, body, footer):
... self.header = header
... self.body = body
... self.footer = footer
... def __str__(self):
... return '{}\n{}\n{}'.format(
... self.header,
... self.body,
... self.footer
... )
...
>>> class DocumentHeader:
... def __init__(self, text):
... self.text = text
... def __str__(self):
... return 'header {{\n\t{}\n'.format(self.text)
...
>>> class DocumentBody:
... def __init__(self, blocks):
... self.blocks = blocks
... def __str__(self):
... return '\n'.join(map(str, self.blocks))
... def rename_blocks(self):
... for block in self.blocks:
... block.rename_to_number_add_1()
... block.rename_to_number_width(3)
... block.rename_to_prefix('<')
... block.rename_to_suffix('>')
...
>>> class DocumentBodyBlock:
... def __init__(self, name, text):
... self.name = name
... self.text = text
... def __str__(self):
... return ('\tblock "{}" {{\n'
... '\t\t{}\n'
... '\t}}').format(self.name, self.text)
... def rename_to_prefix(self, text):
... self.name = text + self.name
... def rename_to_suffix(self, text):
... self.name = self.name + text
... def rename_to_number_add_1(self):
... self.name = re.sub(
... r'\d+',
... lambda mo: str(int(mo.group()) + 1),
... self.name
... )
... def rename_to_number_width(self, n):
... self.name = '{:0{w}d}'.format(int(self.name), w=n)
...
>>> class DocumentFooter:
... def __init__(self, text):
... self.text = text
... def __str__(self):
... return '\n\t{}\n}} footer'.format(self.text)
...
>>> body_blocks = (
... DocumentBodyBlock('1', 'block text 1'),
... DocumentBodyBlock('2', 'block text 2'),
... DocumentBodyBlock('3', 'block text 3'),
... DocumentBodyBlock('4', 'block text 4'),
... DocumentBodyBlock('5', 'block text 5')
... )
>>> body = DocumentBody(body_blocks)
>>>
>>> document = Document(
... DocumentHeader('header text'),
... body,
... DocumentFooter('footer text')
... )
>>>
>>> out = str(document)
>>> print(out)
header {
header text
block "1" {
block text 1
}
block "2" {
block text 2
}
block "3" {
block text 3
}
block "4" {
block text 4
}
block "5" {
block text 5
}
footer text
} footer
>>>
>>> body.rename_blocks()
>>>
>>> out = str(document)
>>> print(out)
header {
header text
block "<002>" {
block text 1
}
block "<003>" {
block text 2
}
block "<004>" {
block text 3
}
block "<005>" {
block text 4
}
block "<006>" {
block text 5
}
footer text
} footer
>>>
Здесь сформирована структура документа, над которой определены операции. Таким образом мы можем получить один документ, потом провести над ним какие-то операции и получить из него другой документ. Естественно, таких документов можно наделать много разных. И потом мы можем брать информацию из одного такого документа с помощью его операций, затем трансформировать эти данные и затем передавать эту новую информацию в другой документ и записывать в него с помощью его операций.
Да, и это не ООП. Это просто абстрагирование и агрегирование объектов, не более. То есть это ерунда на школьном уровне.