Что было бы быстрым способом прочитать файл свойств в python?

У меня есть файл с форматом

VarName=Value
.
.

Я хочу прочитать его в хэш, чтобы H("VarName") вернул значение.

Что было бы быстрым способом? (прочитайте набор строк, разделите их все, где знак равенства, а затем помещаете его в хэш?

Я работаю с python.

Ответ 1

Ответ oneliner:

H = dict(line.strip().split('=') for line in open('filename.txt'))

(необязательно используйте .split() с maxsplit=1, если значения могут также содержать символ "=" )

Ответ 2

Возможно, ConfigParser может вам помочь.

Ответ 3

При ответе @Steven не учитываются комментарии и новые строки в файле свойств, это делает:

H = dict(line.strip().split('=') for line in open('file.properties') if not line.startswith('#') and not line.startswith('\n'))  

Ответ 4

d = {}
with open('filename') as f:
    for line in f:
        key, value = line.split('=')
        d[key] = value

Изменить: Как было предложено форте, вы можете изменить его на

    for line in f:
        tokens = line.split('=')
        d[tokens[0]] = '='.join(tokens[1:])

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

Ответ 6

модуль csv позволит вам сделать это достаточно легко:

import csv
H = dict([(row[0], row[1]) for row in csv.reader(open('the_file', 'r'), delimiter='=' )])

Ответ 7

Это может быть глупый ответ, но кто знает, может быть, это может вам помочь:)

измените расширение вашего файла на .py и выполните необходимые изменения следующим образом:

file.py

VarName="Value"   # if it a string
VarName_2=1
# and you can also assign a dict a list to a var, how cool is that ?

и поместите его в дерево пакетов или в sys.path, и теперь вы можете вызвать его так, как это описано в script, если вы хотите его использовать:

>>> import file
>>> file.VarName
'Value'

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

Теперь вы можете поместить свой -1 влево:)

Ответ 9

Если вам нужно прочитать все значения из раздела в файле свойств простым способом:

Формат файла config.properties:

[SECTION_NAME]

key1 = значение1

key2 = value2

Код:

   import configparser

   config = configparser.RawConfigParser()
   config.read('path_to_config.properties file')

   details_dict = dict(config.items('SECTION_NAME'))

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

details_dict:

{'key1':'value1', 'key2':'value2'}

Ответ 10

ОК, никто в ответах не упомянул об этом, поэтому, я думаю, я собираюсь. Если вы пишете Python и имеете контроль над своим интерпретатором, возможно, вы можете заставить использовать Jython переводчик.

Jython - это интерпретатор Python, полностью реализованный на Java. У вас есть все стандартные библиотеки Python у вас под рукой, с дополнительным преимуществом всех доступных библиотек Java SE.

Я на самом деле не выполнил ни одно из следующих (подумайте, что это больше похоже на psudeo-code без обработки исключений), но вы можете смешивать и сопоставлять библиотеки Python и Java, а ваш код может выглядеть примерно так:

from java.util import Properties
from java.io import File, FileInputStream
import os
javasPropertyObject = Properties()
pathToPropFile = os.path.join('path', 'to', 'property', 'file.properties')
if os.path.isfile(pathToPropFile):
    #this is java.io.File, not Python file descriptor
    propFile = File(pathToPropFile )
    javasFileInputStreamObject = FileInputStream(propFile)
    javasPropertyObject.load(javasFileInputStreamObject)

    #now we can pull out Java properties as defined by the .property file grammar
    myProp = javasPropertyObject.getProperty('myPropName')

где такой файл будет действителен, что не будет в простых решениях split on '=':

myPropName1:value
myPropName2=value
myPropName3=\
value
#this is a = comment
myPropName4:my \
value
myPropNameWithUnicode=\u0009

Недостатком является то, что вы теряете способность быть переносимым среди разных интерпретаторов Python, и теперь вы заблокированы в Jython. Если вы попытаетесь использовать этот подход, вы будете заперты в библиотеку. Причина, по которой мне нравится Jython, - это то, что вы добавили гибкость при наличии всех доступных библиотек Java SE.