Разбор Python вложенных упорядоченных - PullRequest
0 голосов
/ 12 сентября 2018

Что делать, если файл был таким:

OrderedDict
([
 ('activateable', False),
 ('Thisfield', 
    [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_1’),  (‘amount’, ‘10’)]),
    [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_2’),  (‘amount’, ‘10’)])
 ),
('Thisfield2', 
    [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_1’),  (‘amount’, ‘10’)]),
    [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_2’),  (‘amount’, ‘10’)])
 ),
('Thisfield3', 
    [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_1’),  (‘amount’, ‘10’)]),
    [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_2’),  (‘amount’, ‘10’)])
 )
 ('pin', False)
])

... и я хотел только вернуть 'Thisfield1, Thisfield2, Thisfield3'?

1 Ответ

0 голосов
/ 13 сентября 2018

Сначала я думал, что вы вводите Python, но это не так:

  • он имеет кавычки слева и справа в Юникоде (U + 2018 / U + 2019)
  • этоis имеет несбалансированные квадратные скобки
  • как минимум потребуется запятая перед ('pin', False)

Итак, учитывая теги на вашем вопросе, это должен быть документ YAML, что означает, что он имеетодин многострочный простой скаляр в качестве контента.И когда вы загрузите его с помощью синтаксического анализатора YAML, вы получите весь скаляр, загруженный в виде одной строки без перевода строки:

OrderedDict ([ ('activateable', False), ('Thisfield', [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_1’),  (‘amount’, ‘10’)]), [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_2’),  (‘amount’, ‘10’)]) ), ('Thisfield2', [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_1’),  (‘amount’, ‘10’)]), [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_2’),  (‘amount’, ‘10’)]) ), ('Thisfield3', [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_1’),  (‘amount’, ‘10’)]), [OrderedDict ([ ('autoNumber', False),  ('name', ‘col_2’),  (‘amount’, ‘10’)]) ) ('pin', False) ])

, который не так просто проанализировать, как исходный входной файл.

Таким образом, вам, вероятно, легче будет просто "проанализировать" строки ввода:

def get_thisfields(fp):
    vals = []
    for line in fp:
        line = line.strip()
        if not line.startswith(u"('This"):
            continue
        vals.append(line.split("'")[1])
    return ', '.join(vals)

print(get_thisfields(open('input.yaml')))

, учитывая ваш входной файл "YAML", get_thisfields() возвращает:

Thisfield, Thisfield2, Thisfield3

, как выпросьба.

...