Какой бы быстрый способ прочитать файл свойств в Python? - PullRequest
12 голосов
/ 22 октября 2010

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

VarName=Value
.
.

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

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

Я работаю с Python.

Ответы [ 10 ]

21 голосов
/ 22 октября 2010

Ответ oneliner:

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

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

10 голосов
/ 22 октября 2010

Может быть ConfigParser может помочь вам.

8 голосов
/ 29 декабря 2015

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

H = dict(line.strip().split('=') for line in open('file.properties') if not line.startswith('#') and not line.startswith('\n'))  
7 голосов
/ 22 октября 2010
d = {}
with open('filename') as f:
    for line in f:
        key, value = line.split('=')
        d[key] = value

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

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

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

3 голосов
/ 22 октября 2010
2 голосов
/ 05 июля 2017

Для python2 есть свойства 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)
2 голосов
/ 22 октября 2010

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

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

file.py

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

и поместите его в дерево пакетов или в sys.path, и теперь вы можете вызывать его в скрипте следующим образом:

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

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

Теперь вы можете поставить -1 в левом углу :)1013 *

2 голосов
/ 22 октября 2010

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

import csv
H = dict([(row[0], row[1]) for row in csv.reader(open('the_file', 'r'), delimiter='=' )])
0 голосов
/ 03 октября 2017

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

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

На самом деле я не выполнил ни одного из следующих действий (думаю, что это больше похоже на psudeo-код без исключения).обработки), но вы можете смешивать и сопоставлять библиотеки 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's 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.

0 голосов
/ 17 января 2017

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

Структура файла config.properties:

[SECTION_NAME]  
key1 = value1  
key2 = value2  

Ваш код:

import configparser

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

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

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

details_dict becomes

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

Теперь, чтобы получить значение ключа key1:

value_1 = details_dict['key1']

Поместить еговсе в методе, который читает этот раздел из файла конфигурации только один раз (при первом вызове метода во время выполнения программы).

def get_config_dict():
    if not hasattr(get_config_dict, 'config_dict'):
        get_config_dict.config_dict = dict(config.items('SECTION_NAME'))
    return get_config_dict.config_dict

Теперь вызовите вышеуказанную функцию и получите требуемое значение ключа:

config_details = get_config_dict()
key_1_value = config_details['key1'] 
...