Разобрать пары ключ-значение в текстовом файле - PullRequest
16 голосов
/ 06 февраля 2012

Я новичок в Python, и я ищу, как разобрать файл .txt.Мой файл .txt представляет собой список имен с вычислительной информацией, такой как:

myfile.txt

var0 = 16
var1 = 1.12434E10
var2= -1.923E-3
var3 = 920

Как прочитать значения и поместить их в myvar0, myvar1, myvar2, myvar3 в python?

Ответы [ 6 ]

46 голосов
/ 06 февраля 2012

Я предлагаю хранить значения в словаре, а не в отдельных локальных переменных:

myvars = {}
with open("namelist.txt") as myfile:
    for line in myfile:
        name, var = line.partition("=")[::2]
        myvars[name.strip()] = float(var)

Теперь обращайтесь к ним как myvars["var1"]. Если все имена являются допустимыми именами переменных Python, вы можете указать это ниже:

names = type("Names", [object], myvars)

и получить доступ к значениям, например, names.var1.

4 голосов
/ 06 мая 2018

Я лично решил эту проблему, создав файл .py, который просто содержит все параметры в качестве переменных - затем сделал:

include PARAMETERS.py

в программных модулях, которым нужны параметры.

Этонемного некрасиво, но с ОЧЕНЬ просто и легко работать.

2 голосов
/ 06 февраля 2012

Как подсказывает @kev, модуль configparser - это то, что нужно.

Тем не менее, в некоторых сценариях (я признаю, это немного уродливо), но очень простой и эффективный способ сделать это - переименовать myfile.txt в myfile.py и сделать from myfile import * (после того, как вы исправите опечатку var 0 -> var0)

Однако, это очень небезопасно , поэтому, если файл взят из внешнего источника или может быть записан злоумышленником, используйте что-то , которое проверяет данные, а не выполняет их. вслепую.

0 голосов
/ 09 октября 2018

Понятия Dict ( PEP 274 ) можно использовать для более короткого выражения (60 символов):

d = {k:float(v) for k, v in (l.split('=') for l in open(f))}

EDIT: сокращено с 72 до 60 символов благодаря предложению @jmb (избегать .readlines()).

0 голосов
/ 31 августа 2018

Используйте pandas.read_csv , когда формат файла становится более необычным (например, комментарии).

val = u'''var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
var3 = 920'''
print(pandas.read_csv(StringIO(val), # or read_csv('myfile.txt',
            delimiter='\s*=\s*',
            header=None,
            names=['key','value'],
            dtype=dict(key=numpy.object,value=numpy.object), # or numpy.float64
            index_col=['key']).to_dict()['value'])
# prints {u'var1': u'1.12434E10', u'var0': u'16', u'var3': u'920', u'var2': u'-1.923E-3'}
0 голосов
/ 26 июля 2017

Если в одной строке несколько значений, разделенных запятыми, вот код для анализа:

    res = {}                                                                                                                                                                                             

    pairs = args.split(", ")                                                                                                                                                                             
    for p in pairs:                                                                                                                                                                                      
        var, val = p.split("=")                                                                                                                                                                          
        res[var] = val                                                                                                                                                                                   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...