python: чтение и разделение файлов в списке словарей

#python #file #list #dictionary #split

#python #файл #Список #словарь #разделение

Вопрос:

У меня возникли проблемы с преобразованием содержимого файла в список словарей, не могли бы вы посоветовать?

 File content:
host1.example.com#192.168.0.1#web server 
host2.example.com#192.168.0.5#dns server
host3.example.com#192.168.0.7#web server 
host4.example.com#192.168.0.9#application server 
host5.example.com#192.168.0.10#database server
  

Рядом с папкой находится несколько файлов с одинаковым форматом. В конце я хотел бы получить список словарей в следующем формате:

 [ {'dns': 'host1.example.com', 'ip': '192.168.0.1', 'description': 'web_server'},
{'dns': 'host2.example.com', 'ip': '192.168.0.5', 'description': 'dns server'}, 
{'dns': 'host3.example.com', 'ip': '192.168.0.7', 'description': 'web server'}, 
{'dns': 'host4.example.com', 'ip': '192.168.0.9', 'description': 'application server'},
{'dns': 'host5.example.com', 'ip': '192.168.0.10', 'description': 'database server'} ]
  

Заранее благодарю вас!

Ответ №1:

Во-первых, вы хотите разделить каждую строку на # . Затем вы можете использовать zip для архивирования их вместе с ярлыками, а затем преобразовать это в словарь.

 out = []
labels = ['dns', 'ip', 'description']
for line in data:
    out.append(dict(zip(labels, line.split('#'))))
  

Эта одна строка добавления немного сложна, поэтому, чтобы разбить ее:

 # makes the list ['host2.example.com', '192.168.0.7', 'web server']
line.split('#')  

# takes the labels list and matches them up:
# [('dns', 'host2.example.com'),
#  ('ip', '192.168.0.7'),
#  ('description', 'web server')]
zip(labels, line.split('#'))  

# takes each tuple and makes the first item the key,
#  and the second item the value
dict(...)  
  

Комментарии:

1. На самом деле, ваш ответ — это то, что я бы сделал лично, но, к сожалению, компиляции списков сбивают с толку большинство людей. 1 и вам тоже.

Ответ №2:

 rows = []
for line in input_file:
    r = line.split('#')
    rows.append({'dns':r[0],'ip':r[1],'description':r[2]})
  

Ответ №3:

Предполагая, что ваш файл infile.txt

 >>> entries = (line.strip().split("#") for line in open("infile.txt", "r"))
>>> output = [dict(zip(("dns", "ip", "description"), e)) for e in entries]
>>> print output
[{'ip': '192.168.0.1', 'description': 'web server', 'dns': 'host1.example.com'}, {'ip': '192.168.0.5', 'description': 'dns server', 'dns': 'host2.example.com'}, {'ip': '192.168.0.7', 'description': 'web server', 'dns': 'host3.example.com'}, {'ip': '192.168.0.9', 'description': 'application server', 'dns': 'host4.example.com'}, {'ip': '192.168.0.10', 'description': 'database server', 'dns': 'host5.example.com'}]
  

Ответ №4:

 >>> map(lambda x : dict(zip(("dns", "ip", "description"), tuple(x.strip().split('#')))), open('input_file'))
  

Комментарии:

1. Я люблю map так же сильно, как и любой другой парень, но в последнее время наблюдается большой толчок к использованию вместо этого понимания списков. Смотрите ответ Шона Чина.