У мене є файл, що складається з двох стовпців, тобто
1 a
2 b
3 c
Я хочу прочитати цей файл у словнику, щоб стовпець 1 був ключем, а стовпець 2 - значенням, тобто
d = {1:'a', 2:'b', 3:'c'}
Файл невеликий, тому ефективність не є проблемою.
У мене є файл, що складається з двох стовпців, тобто
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
використовується тут для обробки файлу очищення. Коли ви залишите блок (або просто за допомогою звичайного потоку виконання, або за винятком), файл буде автоматично закритий. Ви можете прочитати більше про контекстні менеджери в Python тут: effbot.org/zone/python-with-statement.htm
for line in open("file.txt"):
робити прибирання так само. І якщо f - місцеве значення, f
воно звільняється, коли область втрачається. Єдиний випадок, коли це твердження є корисним, це довга функція (не підходить для якості) або якщо ви використовуєте глобальну змінну.
for line in open('file.txt')
нічого НЕ робити Cleanup таким же чином. Не всі реалізації Python однакові. with
гарантує, що файл буде закрито після виходу з блоку. Коли for
лінія завершена, close
може бути викликаний. CPython
це буде, але такі версії, як IronPython
ліниві збирачі сміття.
Після цього ключ залишиться як рядок:
with open('infile.txt') as f:
d = dict(x.rstrip().split(None, 1) for x in f)
dict([line.split() for line in f])
, іммо.
dict([x.rstrip().split(None, 1) for x in f])
замість dict(x.rstrip().split(None, 1) for x in f)
. Для тих, хто думає про одне і те ж, перший є виразом генератора замість розуміння списку, як пояснено тут: python.org/dev/peps/pep-0289(PEP-289) . Дізнався щось нове!
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)
partition
? і with
заяву?
partition
швидше і створено саме для цієї мети.
with
- це простий спосіб переконатися, що він є.
strip
, я б сказав.
За розумінням словника
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
Або по пандах
import pandas as pd
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
IMHO трохи пітонічніше для використання генераторів (для цього, мабуть, потрібно 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()}
Це також відфільтрує рядки, які не починаються з цілого числа або не містять рівно два елементи
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)
re
? серйозно?
split()
не працює майже безшумно, якщо формат файлу відсутній.
Якщо ви любите один лайнер, спробуйте:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
Вхідний ФАЙЛ = Шлях до файлу, 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:]
Більшість методів для зберігання словника використовують JSON, Pickle або рядкове читання. Якщо ви не редагуєте словник за межами Python, цього простого методу вистачить навіть на складні словники. Хоча Pickle буде кращим для великих словників.
x = {1:'a', 2:'b', 3:'c'}
f = 'file.txt'
print(x, file=open(f,'w')) # file.txt >>> {1:'a', 2:'b', 3:'c'}
y = eval(open(f,'r').read())
print(x==y) # >>> True