Ответ 1
Ответ oneliner:
H = dict(line.strip().split('=') for line in open('filename.txt'))
(необязательно используйте .split()
с maxsplit=1
, если значения могут также содержать символ "=" )
У меня есть файл с форматом
VarName=Value
.
.
Я хочу прочитать его в хэш, чтобы H("VarName")
вернул значение.
Что было бы быстрым способом? (прочитайте набор строк, разделите их все, где знак равенства, а затем помещаете его в хэш?
Я работаю с python.
Ответ oneliner:
H = dict(line.strip().split('=') for line in open('filename.txt'))
(необязательно используйте .split()
с maxsplit=1
, если значения могут также содержать символ "=" )
Возможно, ConfigParser может вам помочь.
При ответе @Steven не учитываются комментарии и новые строки в файле свойств, это делает:
H = dict(line.strip().split('=') for line in open('file.properties') if not line.startswith('#') and not line.startswith('\n'))
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:])
который обрабатывал бы случай, когда в значении допустимы знаки равенства, но все равно будет терпеть неудачу, если имя может иметь равные знаки, - для этого вам понадобится истинный синтаксический анализатор.
Или ConfigObj
модуль csv позволит вам сделать это достаточно легко:
import csv
H = dict([(row[0], row[1]) for row in csv.reader(open('the_file', 'r'), delimiter='=' )])
Это может быть глупый ответ, но кто знает, может быть, это может вам помочь:)
измените расширение вашего файла на .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 влево:)
Для python2 есть jproperties https://pypi.python.org/pypi/jproperties/1.0.1
Для python2/3 есть javaproperties http://javaproperties.readthedocs.io/en/v0.1.0/
так же просто, как:
import os, javaproperties
with open(file, 'rb') as f:
properties_dict = javaproperties.load(f)
Если вам нужно прочитать все значения из раздела в файле свойств простым способом:
Формат файла 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'}
ОК, никто в ответах не упомянул об этом, поэтому, я думаю, я собираюсь. Если вы пишете 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.