webentwicklung-frage-antwort-db.com.de

analysieren der .properties-Datei in Python

Das Modul ConfigParser löst eine Ausnahme aus, wenn eine einfache .properties -Datei im Java-Stil analysiert wird, deren Inhalt aus Schlüssel-Wert-Paaren besteht (d. Gibt es eine Problemumgehung?

44
Tshepang

Angenommen, Sie haben z.

$ cat my.props
first: primo
second: secondo
third: terzo

d. h. wäre ein .config-Format, es fehlt jedoch ein führender Abschnittsname. Dann kann der Abschnittskopf leicht gefälscht werden:

import ConfigParser

class FakeSecHead(object):
    def __init__(self, fp):
        self.fp = fp
        self.sechead = '[asection]\n'

    def readline(self):
        if self.sechead:
            try: 
                return self.sechead
            finally: 
                self.sechead = None
        else: 
            return self.fp.readline()

Verwendungszweck:

cp = ConfigParser.SafeConfigParser()
cp.readfp(FakeSecHead(open('my.props')))
print cp.items('asection')

Ausgabe:

[('second', 'secondo'), ('third', 'terzo'), ('first', 'primo')]
73
Alex Martelli

Ich dachte, MestreLions "read_string" -Kommentar war nett und einfach und verdient ein Beispiel.

Für Python 3.2+ können Sie die Idee "Dummy-Abschnitt" folgendermaßen implementieren:

with open(CONFIG_PATH, 'r') as f:
    config_string = '[dummy_section]\n' + f.read()
config = configparser.ConfigParser()
config.read_string(config_string)
32
CoupleWavyLines

Meine Lösung ist, StringIO zu verwenden und einen einfachen Dummy-Header voranzustellen:

import StringIO
import os
config = StringIO.StringIO()
config.write('[dummysection]\n')
config.write(open('myrealconfig.ini').read())
config.seek(0, os.SEEK_SET)

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.readfp(config)
somevalue = cp.getint('dummysection', 'somevalue')
31
tauran

Die Antwort von Alex Martelli funktioniert nicht für Python 3.2+: readfp() wurde durch read_file() ersetzt und benötigt jetzt einen Iterator anstelle der readline()-Methode.

Hier ist ein Ausschnitt, der den gleichen Ansatz verwendet, aber in Python 3.2+ funktioniert.

>>> import configparser
>>> def add_section_header(properties_file, header_name):
...   # configparser.ConfigParser requires at least one section header in a properties file.
...   # Our properties file doesn't have one, so add a header to it on the fly.
...   yield '[{}]\n'.format(header_name)
...   for line in properties_file:
...     yield line
...
>>> file = open('my.props', encoding="utf_8")
>>> config = configparser.ConfigParser()
>>> config.read_file(add_section_header(file, 'asection'), source='my.props')
>>> config['asection']['first']
'primo'
>>> dict(config['asection'])
{'second': 'secondo', 'third': 'terzo', 'first': 'primo'}
>>>
18
Oscar de Groot
with open('some.properties') as file:
    props = dict(line.strip().split('=', 1) for line in file)

Gutschrift an So erstellen Sie ein Wörterbuch, das Schlüssel-Wert-Paare aus einer Textdatei enthält

maxsplit=1 ist wichtig, wenn der Wert Gleichheitszeichen enthält (z. B. someUrl=https://some.site.com/endpoint?id=some-value&someotherkey=value).

4
user9192156

YAY! Andere Version

Basierend auf dieser Antwort (der Zusatz verwendet eine dict, with -Anweisung und unterstützt das %-Zeichen)

import ConfigParser
import StringIO
import os

def read_properties_file(file_path):
    with open(file_path) as f:
        config = StringIO.StringIO()
        config.write('[dummy_section]\n')
        config.write(f.read().replace('%', '%%'))
        config.seek(0, os.SEEK_SET)

        cp = ConfigParser.SafeConfigParser()
        cp.readfp(config)

        return dict(cp.items('dummy_section'))

Verwendungszweck

props = read_properties_file('/tmp/database.properties')

# It will raise if `name` is not in the properties file
name = props['name']

# And if you deal with optional settings, use:
connection_string = props.get('connection-string')
password = props.get('password')

print name, connection_string, password

die .properties-Datei, die in meinem Beispiel verwendet wird

name=mongo
connection-string=mongodb://...
password=my-password%1234

Bearbeiten Sie den 06.11.2015

Dank Neill Lima Erwähnung gab es ein Problem mit dem %-Zeichen.

Der Grund dafür ist ConfigParser, um .ini-Dateien zu analysieren. Das Zeichen % ist eine spezielle Syntax. Um das %-Zeichen zu verwenden, fügen Sie einfach ein __-Ersetzen von % mit %% gemäß der .ini-Syntax hinzu.

3
Jossef Harush

Diese Antwort schlägt die Verwendung von itertools.chain in Python 3 vor.

from configparser import ConfigParser
from itertools import chain

parser = ConfigParser()
with open("foo.conf") as lines:
    lines = chain(("[dummysection]",), lines)  # This line does the trick.
    parser.read_file(lines)
1
Christian Long
from pyjavaproperties import Properties
p = Properties()
p.load(open('test.properties'))
p.list()
print p
print p.items()
print p['name3']
p['name3'] = 'changed = value'
print p['name3']
p['new key'] = 'new value'
p.store(open('test2.properties','w'))
0
Andy Quiroz