#python #dictionary #text-files
#python #словарь #текстовые файлы
Вопрос:
Я нахожусь на вводном курсе для студентов Python и работаю над текстовым файлом.
Пример его содержимого можно увидеть ниже:
Special Type A Sunflower
2017-10-19 18:20:30
Asteraceae
Brought to the USA by Europeans
Ingredient for Sunflower Oil
Needs full sun
Moist Soil, with heavy mulch
Water only when top 2 inches of soil is dry
Tropical Sealion
2020-04-25 12:10:05
Pinnipeds
Mostly found in zoos
Likes Fish
Likes Balls
Likes Zookeepers
Honey Badger
2018-06-06 16:15:25
Mustelidae
Eats anything
В настоящее время я пытаюсь преобразовать эти строки в значения словаря, создав только 3 ключа.
Первым ключом является «Name», соответствующим значением будет каждая первая строка каждого текстового блока.
Вторым ключом является «Дата», соответствующим значением будет каждая вторая строка каждого текстового блока.
Третий ключ — «Информация», соответствующим значением будет каждая третья строка и далее каждого текстового блока, останавливаясь на промежутке между текстовыми блоками. Я считаю, что это тоже должен быть список значений.
Мой прогресс здесь:
import itertools
import os
MyFilePath = os.getcwd() # absolute directory the file is in
ActualFile = "myplants.txt"
FinalFilePath = os.path.join(MyFilePath, ActualFile)
def TextFileToDictionary():
dictionary_1 = {}
textfile = open(FinalFilePath, 'r')
first_line = textfile.readline()
second_line = textfile.readline()
third_line = textfile.readline()
for line in textfile:
dictionary_1["name"] = first_line
dictionary_1["date"] = second_line
dictionary_1["information"] = third_line
print(dictionary_1)
textfile.close()
TextFileToDictionary()
Хотя я проанализировал строки как значения в словаре,
Я не могу повторить их по каждому текстовому блоку, чтобы убедиться, что все текстовые блоки становятся значениями словаря.
Я также не могу преобразовать каждую третью строку и далее в список значений.
Обратите внимание, что текстовые блоки имеют неодинаковую длину.
Таким образом, конечный результат должен напоминать:
dictionary_1 = {'Name' : "Special Type A Sunflower", 'Date' : "2017-10-19 18:20:30", 'Information' : ["Asteraceae, Brought to the USA by Europeans, Ingredient for Sunflower Oil, Needs full sun, Moist Soil, with heavy mulch, Water only when top 2 inches of soil is dry"]}
dictionary_2 = {'Name' : "Tropical Sealion", "Date" : "2020-04-25 12:10:05", "Information" : ["Pinnipeds, Mostly found in zoos, Likes Fish, Likes Balls, Likes Zookeepers"]}
И так далее.
Кто-нибудь знает, как изменить код, чтобы он напоминал желаемый конечный результат?
Большое спасибо!
Комментарии:
1. Вы уверены, что это должно быть
"Asteraceae, Brought to the USA by Europeans, Ingredient for Sunflower Oil, Needs full sun, Moist Soil, with heavy mulch, Water only when top 2 inches of soil is dry"
, а не"Asteraceae", "Brought to the USA by Europeans", "Ingredient for Sunflower Oil", "Needs full sun", "Moist Soil", "with heavy mulch", "Water only when top 2 inches of soil is dry"
?2.
third_line
вам нужно читать, пока не найдете пустую строку или конец файла3. @Накопление возможно ли для первого варианта?
Ответ №1:
Мое решение для TextFileToDictionary()
функции заключается в следующем:
data = [] #Blank list
with open(FinalFilePath, "r") as file: #Open file
sections = file.read().split("nn") #Split it by double linebreaks
for section in sections: #Iterate through sections
lines = section.split("n") #Split sections by linebreaks
if len(lines) < 3: #Make sure that there is the correct amount of lines
return "ERROR!"
data.append({ #Add a dictionary to the data with:
"Name": lines[0], #First line: name
"Date": lines[1], #Second line: date
"Information": lines[2:] #Third line and onwards: info
})
return data #Returns a list of dictionaries containing the data about each species
Если вы запустили функцию в своем файле примера, она должна вернуть следующее:
[
{
"Name": "Special Type A Sunflower",
"Date": "2017-10-19 18:20:30",
"Information": ["Asteraceae", "Brought to the USA by Europeans" etc... ]
},
{
"Name": "Tropical Sealion",
"Date": "2020-04-25 12:10:05",
"Information": ["Pinnipeds", "Mostly found in zoos" etc... ]
} #and so on.
]
Комментарии:
1. Большое спасибо! Это было то, что я искал! Мне также было интересно, можно ли также объединить список значений для ключа: «Информация» в один элемент.
2. @TropicalMagic Как бы вы хотели, чтобы они были объединены? Вы можете использовать
"SEPARATOR".join(lines[2:])
для соединения их разделителем или использовать ‘pythony’ способ понимания списка:"".join([(info) for info in lines[2:]])
и отредактировать первый бит в скобках.3. Приятно! Спасибо за совет!
Ответ №2:
Более простая версия:
def dicter(file):
with open(file, 'r') as f:
dics = []
blocks = [x. split('n') for x in f.read().split('nn')]
for block in blocks:
dics.append(dict(Name=block[0], Date=block[1], Information=block[2:]))
return dics
print(dicter('your/path/to/file'))
Комментарии:
1. Спасибо! Это тоже выглядит великолепно! Мне также было интересно, есть ли способ разделить словари на новые строки.
Ответ №3:
Я бы использовал regex
, split
и destructuring assignment
.
Я бы посоветовал вам прочитать ваш файл с помощью with
инструкции, таким образом, вам не нужно явно закрывать файл.
with open('myplants.txt') as file:
text = file.read()
Предполагается, что вы уже прочитали свой файл и text
это содержимое.
import re
text = """
Special Type A Sunflower
2017-10-19 18:20:30
Asteraceae
Brought to the USA by Europeans
Ingredient for Sunflower Oil
Needs full sun
Moist Soil, with heavy mulch
Water only when top 2 inches of soil is dry
Tropical Sealion
2020-04-25 12:10:05
Pinnipeds
Mostly found in zoos
Likes Fish
Likes Balls
Likes Zookeepers
Honey Badger
2018-06-06 16:15:25
Mustelidae
Eats anything
"""
regex = re.compile('(?:[^n] n) ', re.MULTILINE)
def parse(section):
name, date_value, *information = section.strip().split('n')
return {
'Name': name,
'Date': date_value,
'Information': information
}
sections = [section for section in regex.findall(text)]
parsed_sections = [parse(section) for section in sections]
for parsed in parsed_sections:
print(parsed)
print()
Вывод
{'Name': 'Special Type A Sunflower ', 'Date': '2017-10-19 18:20:30', 'Information': ['Asteraceae', 'Brought to the USA by Europeans', 'Ingredient for Sunflower Oil', 'Needs full sun', 'Moist Soil, with heavy mulch', 'Water only when top 2 inches of soil is dry']}
{'Name': 'Tropical Sealion', 'Date': '2020-04-25 12:10:05', 'Information': ['Pinnipeds ', 'Mostly found in zoos', 'Likes Fish', 'Likes Balls', 'Likes Zookeepers']}
{'Name': 'Honey Badger', 'Date': '2018-06-06 16:15:25', 'Information': ['Mustelidae', 'Eats anything']}
Комментарии:
1. Спасибо!! Я не знаком с регулярным выражением, но это выглядит великолепно! Словари аккуратно сложены! Мне также было интересно, можно ли объединить элементы списка для ключа: «Информация» в один элемент.
2. Вы имеете в виду, вы хотите, чтобы
Information
было строкой?3. Нет, остается списком, но все в списке находится в пределах одного » »
4. Не уверен, но вы можете попробовать
[f'"{i}"' for i in information]
.5. А, ладно! Спасибо за совет! Большое спасибо!