Как преобразовать файл в словарь? - PullRequest
80 голосов
/ 26 января 2011

У меня есть файл, состоящий из двух столбцов, т.е.

1 a 
2 b 
3 c

Я хочу прочитать этот файл в словаре, чтобы столбец 1 был ключом, а столбец 2 - значением, т. Е.

d = {1:'a', 2:'b', 3:'c'}

Файл небольшой, поэтому эффективность не является проблемой.

Ответы [ 8 ]

133 голосов
/ 26 января 2011
d = {}
with open("file.txt") as f:
    for line in f:
       (key, val) = line.split()
       d[int(key)] = val
13 голосов
/ 26 января 2011

Ключ останется в виде строки:

with open('infile.txt') as f:
  d = dict(x.rstrip().split(None, 1) for x in f)
7 голосов
/ 24 января 2013

Если ваша версия на Python 2.7+, вы также можете использовать dict понимание , например:

with open('infile.txt') as f:
  {int(k): v for line in f for (k, v) in (line.strip().split(None, 1),)}
3 голосов
/ 26 января 2011
def get_pair(line):
    key, sep, value = line.strip().partition(" ")
    return int(key), value

with open("file.txt") as fd:    
    d = dict(get_pair(line) for line in fd)
1 голос
/ 19 июля 2013

ИМХО, немного более питонно использовать генераторы (вероятно, вам нужно 2.7+ для этого):

with open('infile.txt') as fd:
    pairs = (line.split(None) for line in fd)
    res   = {int(pair[0]):pair[1] for pair in pairs if len(pair) == 2 and pair[0].isdigit()}

Это также отфильтрует строки, не начинающиеся с целого числа или не содержащие ровно два элемента

0 голосов
/ 11 июля 2016

Вот еще один вариант ...

events = {}
for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")):
    if line[0][0] == "#":
        continue
    events[line[0]] = line[1] if len(line) == 2 else line[1:]
0 голосов
/ 22 января 2014

Если вы любите один лайнер, попробуйте:

d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')

Входной файл = Путь к файлу, SEP = Символ-разделитель ключа-значения

Не самый элегантный или эффективный способ сделать это, но, тем не менее, довольно интересно:)

0 голосов
/ 26 января 2011
import re

my_file = open('file.txt','r')
d = {}
for i in my_file:
  g = re.search(r'(\d+)\s+(.*)', i) # glob line containing an int and a string
  d[int(g.group(1))] = g.group(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...