Ответ 1
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
У меня есть файл, содержащий два столбца, т.е.
1 a
2 b
3 c
Я хочу прочитать этот файл в словаре, так что столбец 1 является ключом, а столбец 2 - значением, т.е.
d = {1:'a', 2:'b', 3:'c'}
Файл небольшой, поэтому эффективность не является проблемой.
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
Это оставит ключ в виде строки:
with open('infile.txt') as f:
d = dict(x.rstrip().split(None, 1) for x in f)
Если ваша версия 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),)}
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)
IMHO немного больше pythonic для использования генераторов (возможно, для этого вам нужно 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()}
Это также отфильтровывает строки, не начинающиеся с целого числа или не содержащие ровно два элемента
Если вы любите один лайнер, попробуйте:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
Вход FILE = путь к файлу, SEP = символ разделителя ключа
Не самый элегантный или эффективный способ сделать это, но, тем не менее, весьма интересен:)
Здесь другой вариант...
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:]
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)