Вернуть файл как словарь - PullRequest
       1

Вернуть файл как словарь

0 голосов
/ 28 ноября 2018

Итак, вот файл

APPLE: toronto, 2018, garden, tasty, 5
apple is a tasty fruit
>>>end 
apple is a sour fruit
>>>end
grapes: america, 24, organic, sweet, 4
grapes is a sweet fruit
>>>end

Этот файл также содержит символы новой строки.Я хочу, чтобы tp создал словарь, используя файл.это выглядит так

функция def f(file_to: (TextIO))-> Dict[str, List[tuple]]

file_to - введенное имя файла, и он возвращает словарь, как,

{'apple': [('apple is a tasty fruit', 2018, 'garden', 'tasty', 5), (apple is a sour fruit)], 'grapes':['grapes is a sweet fruit', 24, 'organic', 5)]}

каждый из фруктов является ключевыми их описание значений в том виде, как они там отформатированы.Каждый фрукт заканчивается на >>> end

Я пытался

with open (file_to, "r") as myfile:
    data= myfile.readlines()
return data

, он возвращает строки файла в списке с / n, я думаю, я могу использовать strip (), чтобы удалить это иполучить элемент, который стоит перед ':' в качестве ключей.

Код, который я пробовал:

from pprint import pprint
import re
def main():
    fin = open('f1.txt', 'r')

    data = {}
    key = ''
    parsed = []
    for line in fin:
        line = line.rstrip()
        if line.startswith('>'):
            data[key] = parsed
            parsed = []
        elif ':' in line:
            parts = re.split('\W+', line)
            key = parts[0].lower()
            parsed += parts[2:]
        else:
            parsed.insert(0, line)

    fin.close()
    pprint(data)


main()

Не дает ожидаемого результата: (

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я внес некоторые коррективы в ваш код (который я дал вам в предыдущем посте).Я думаю, что это дает то, что вы хотите с вашими обновленными данными.

Данные:

APPLE: toronto, 2018, garden, tasty, 5
apple is a tasty fruit
>>>end
apple is a sour fruit
apple is ripe
>>>end
apple is red
>>>end
grapes: america, 24, organic, sweet, 4
grapes is a sweet fruit
>>>end

А вот обновленный код:

import re

def main():
    fin = open('f1.txt', 'r')

    data = {}

    for line in fin:
        line = line.rstrip()
        if line.startswith('>'):
            if key not in data:
                data[key] = [tuple(parts)]

        elif re.match('^\w+:\s', line):
            key, _, *parts = re.split('[:,]\s+', line)
        else:
            if key in data:
                data[key].append(line)
            else:
                parts.insert(0, line)

    fin.close()

    for key in data:
        if len(data[key]) > 1:
            data[key][1] = tuple(data[key][1:])
            del data[key][2:]

    print(data)


main()

Выход из этогопересмотренные данные и код:

{'APPLE': [('apple is a tasty fruit', '2018', 'garden', 'tasty', '5'), ('apple is a sour fruit', 'apple is ripe', 'apple is red')], 'grapes': [('grapes is a sweet fruit', '24', 'organic', 'sweet', '4')]}
0 голосов
/ 28 ноября 2018

Не думаю, что вам действительно нужны re и pprint.Я попытался с легким пониманием списка и некоторыми заявлениями if.

def main:
    data = {}
    key = ''
    parsed = []
    for line in fin:
        line = line.rstrip()
        if line.startswith('>'):
            continue # If we get a line which starts with a '>', we can skip that line.
        elif ':' in line:
            parts = line.strip().split(":")
            key = parts[0].lower()

            firstInfo = parts[1].split(",") # What we have to add in the value, after reading the next line
            firstInfo.pop(0) # Removing the first element, The State name (as it is not required).

            secondInfo = fin.readline().strip() # Reading the next line. It will be the first value in the list.

            value = [secondInfo]

            value.extend([x for x in firstInfo]) # Extending the value list to add other elements.

            data[key] = value

    print(data["apple"])
    return data

Если у вас возникнут какие-либо проблемы с этой реализацией, я буду рад помочь.(хотя это говорит само за себя: P)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...