Есть ли способ извлечь текст из файла и сделать из него словарь? - PullRequest
0 голосов
/ 20 апреля 2020

Итак, у меня есть файл:

Собака [«кора», «есть», «летать»]

кошка [«мяу», «есть», «летать» ']

Между ними 2x' \ n '. Мне нужно извлечь их и преобразовать в словарь. Когда я пытаюсь прочитать оттуда текст с использованием readlines, я получаю список таких элементов, например:

"Dog ['bark', 'eat', 'fly'] \ n" , '\ n', "Cat ['meow', 'eat', 'fly'] \ n", '\ n']

И я хочу получить такой словарь .. . animal [собака] = [«кора», «есть», «летать»], и то же самое с кошкой. Что я должен использовать? `Может быть, разделить их или что-нибудь еще.

Ответы [ 5 ]

1 голос
/ 20 апреля 2020

Вот решение, использующее регулярное выражение:

import json
import re

s = '''Dog['bark','eat','fly']

Cat['meow', 'eat ', 'fly']'''

dictionary = {}
for line in s.split('\n'):
    if line:
        search = re.search('^([a-zA-Z]+)(\[.+\])$', line, re.IGNORECASE)
        if search:
            key, arr = search.groups()
            dictionary[key] = json.loads(arr.replace('\'', '"'))

print(dictionary)

Вывод:

{'Cat': ['meow', 'eat ', 'fly'], 'Dog': ['bark', 'eat', 'fly']}
1 голос
/ 20 апреля 2020

Вот простое решение. Это требует небольшого количества манипуляций со строками, но я думаю, что это должно соответствовать вашим потребностям.

animals = {}
with open("file.txt") as file_in:
    lines = []
    for line in file_in:
        if (line != "\n"):
            key = line.rstrip().split('[')[0]
            val = (line.rstrip().split('[')[1][:-1]).replace("'", "").replace(" ", "").split(',')
            animals[key] = val

print(animals)
0 голосов
/ 20 апреля 2020

Для более надежного решения, поскольку ввод действительно действителен Python код с несколькими именованными объектами, нарезанными кортежами, вы можете использовать ast.parse, чтобы проанализировать ввод в узлы AST и перебрать пары имя-кортеж, как это :

import ast
s = '''Dog['bark','eat','fly']

Cat['meow', 'eat ', 'fly']'''
{n.value.value.id: [i.value for i in n.value.slice.value.elts] for n in ast.parse(s).body}

Возвращает:

{'Dog': ['bark', 'eat', 'fly'], 'Cat': ['meow', 'eat ', 'fly']}
0 голосов
/ 20 апреля 2020

Сначала нам нужно преобразовать строку в лучший формат:

animalValues=["Dog['bark','eat','fly']\n", '\n', "Cat['meow', 'eat ','fly']\n", '\n']
animalValues=[i.replace("\n","") for i in animalValues if i != "\n"]

Затем мы преобразуем список в dict:

animalDict={i.split("[")[0]: [p.replace("'","") for p in i.split("[")[1].split("]")[0].split(",")] for i in animalValues}
0 голосов
/ 20 апреля 2020
import ast

text = """
Dog['bark','eat','fly']

Cat['meow', 'eat ', 'fly']
"""
animals = {}
for line in text.splitlines():
    if line:
        a, b = line.split("[")
        b = "[" + b
        animals[a] = ast.literal_eval(b)
print(animals)
# {'Dog': ['bark', 'eat', 'fly'], 'Cat': ['meow', 'eat ', 'fly']}
...