Это мой файл: test.txt
Amy|Female|Desc1|12
John|Male|Desc2|10
Mike|Male|Desc3|18
Я попытался создать вложенный словарь, и это не удалось.
Это результат:
{'Amy': '12', 'John': '10', 'Mike': '18'}
Это мой код:
import csv
with open('test.txt') as file:
tsvfile = csv.reader(file, delimiter='|')
d = {}
for row in tsvfile:
d[row[0]] = row[0] #this should be name
d[row[0]] = row[1] #this should be gender
d[row[0]] = row[3] #this should be desc
d[row[0]] = row[3] #this should be age
print(d)
Мой желаемый результат, как показано ниже, но не увенчался успехом.
d = {1{'Name':'Amy', 'Gender':'Female', 'Desc': 'Desc1', 'Age': '12'}
2{'Name':'John', 'Gender':'Male', 'Desc': 'Desc2', 'Age': '10'}
3{'Name':'Mike', 'Gender':'Male', 'Desc': 'Desc3', 'Age': '18'}}
и ниже (только имя и возраст
d1 = {1{'Name':'Amy','Age': '12'}
2{'Name':'John', 'Age': '10'}
3{'Name':'Mike', 'Age': '18'}}
вывод должен быть вложенным словарем, где внешний словарь - это номер строки текстового файла, а внутренний словарь должен быть парой ключ, значение
Достаточно справедливо, но я бы все же рекомендовал использовать для этого массив или, по крайней мере, обновить вопрос, чтобы отразить правильный синтаксис "1": {}
(и т. д.).
Желаемый результат больше похож на список словарей. В этом случае я бы просто изменил ваш код следующим образом:
import csv
with open('test.txt') as file:
tsvfile = csv.reader(file, delimiter='|')
d = []
for row in tsvfile:
entry = {
'Name': row[0],
'Gender': row[1],
'Desc': row[2],
}
d.append(entry)
print(d)
Выход:
[{'Name': 'Amy', 'Gender': 'Female', 'Desc': 'Desc1'},
{'Name': 'John', 'Gender': 'Male', 'Desc': 'Desc2'},
{'Name': 'Mike', 'Gender': 'Male', 'Desc': 'Desc3'}]
Вы даже можете написать цикл более компактно, например:
keys = ["Name","Gender","Desc"]
for row in tsvfile:
entry = { key: value for (key,value) in zip(keys,row) }
d.append(entry)
Обновлено: Если вам нужен словарь с номером строки в качестве ключей, вы можете сделать:
import csv
with open('test.txt') as file:
tsvfile = csv.reader(file, delimiter='|')
d = {}
keys = ["Name","Gender","Desc"]
for i,row in enumerate(tsvfile):
entry = {
'Name': row[0],
'Gender': row[1],
'Desc': row[2],
}
d[i+1] = entry
print(d)
Спасибо. На самом деле желаемый результат - это вложенный словарь, где внешним является номер строки текстового файла.
Если у вас нет пустых строк, это то, что делает список, поскольку для каждой строки вы получаете новую запись. Однако, если вам действительно нужен словарь со строками, вы можете просто перечислить (см. мое редактирование)
Вот как это сделать без импорта csv, учитывая постоянный формат данных:
fixed = {}
i = 1
with open("test.txt", 'r') as f:
for line in f:
listDetails = line.strip().split('|')
fixed[i] = {"Name": listDetails[0]}
fixed[i].update({"Sex": listDetails[1]})
fixed[i].update({"Description": listDetails[2]})
fixed[i].update({"Age": listDetails[3]})
i+=1
print(fixed)
Это должно превратить
Amy|Female|Desc1|12
John|Male|Desc2|10
Mike|Male|Desc3|18
К
{1: {'Name': 'Amy', 'Sex': 'Female', 'Description': 'Desc1', 'Age': '12'}, 2: {'Name': 'John', 'Sex': 'Male', 'Description': 'Desc2', 'Age': '10'}, 3: {'Name': 'Mike', 'Sex': 'Male', 'Description': 'Desc3', 'Age': '18'}}
Редактировать: как сказал Накор, на самом деле нет смысла делать здесь диктовку, просто опубликовал это, если вам действительно нужно сделать это диктовкой.
Это работает. Спасибо. Мне нужен вложенный словарь в основном для отслеживания номера строки элемента
1) Вложенный словарь, я внес некоторые изменения в тот же код, это может вам помочь.
import csv
with open('hello.txt') as file:
tsvfile = csv.reader(file, delimiter='|')
final_dict = {}
counter = 1
for row in tsvfile:
d = {}
d['Name'] = row[0] #this should be name
d['Gender'] = row[1] #this should be gender
d['Desc'] = row[2] #this should be desc
d['Age'] = row[3] #this should be age
final_dict[counter] = d
counter+=1
print(final_dict)
Добро пожаловать в СО! Я не совсем следую желаемому результату, который не является допустимым синтаксисом Python. Если ключи вашего словаря представляют собой последовательные целые числа 1, 2, 3 и т. д., я бы рекомендовал использовать простой старый список. Можешь пояснить свои ожидания? Спасибо.