У меня есть файл, состоящий из двух столбцов, т.е.
1 a
2 b
3 c
Я хочу прочитать этот файл в словаре, чтобы столбец 1 был ключом, а столбец 2 - значением, т. Е.
d = {1:'a', 2:'b', 3:'c'}
Файл небольшой, поэтому эффективность не является проблемой.
python
file
dictionary
Даррен Дж. Фицпатрик
источник
источник
with
здесь используется для очистки файла. Когда вы покидаете блок (либо обычным потоком выполнения, либо в виде исключения), файл будет автоматически закрыт. Вы можете узнать больше о контекстных менеджерах в Python здесь: effbot.org/zone/python-with-statement.htmfor 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) . Узнал что-то новое!Вы также можете использовать понимание слов, например:
with open("infile.txt") as f: d = {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)
источник
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 немного больше 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()}
Это также отфильтрует строки, не начинающиеся с целого числа или не содержащие ровно два элемента.
источник
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
источник
У меня было требование взять значения из текстового файла и использовать их в качестве пары значений ключа. у меня есть содержимое в текстовом файле как ключ = значение, поэтому я использовал метод разделения с разделителем как "=" и написал ниже код
d = {} file = open("filename.txt") for x in file: f = x.split("=") d.update({f[0].strip(): f[1].strip()})
При использовании метода полосы все пробелы до или после разделителя "=" удаляются, и вы получаете ожидаемые данные в формате словаря.
источник
=
`` ответить на вопрос?