Typowy plik wygenerowany przez ConfigParser wygląda następująco:
[Section]
bar=foo
[Section 2]
bar2= baz
Czy istnieje sposób na indeksowanie list, takich jak na przykład:
[Section 3]
barList={
item1,
item2
}
Powiązane pytanie: Unikalne klucze Pythona ConfigParser na sekcję
python
configparser
pistacchio
źródło
źródło
Trochę późno, ale dla niektórych może pomóc. Używam kombinacji ConfigParser i JSON:
po prostu przeczytaj:
Możesz nawet łamać linie, jeśli lista jest długa (dzięki @ peter-smit):
Oczywiście mógłbym po prostu użyć JSON, ale uważam, że pliki konfiguracyjne są dużo bardziej czytelne, a sekcja [DEFAULT] jest bardzo przydatna.
źródło
key5 : [r"abc $x_i$", r"def $y_j$"]
? Podnoszą błądjson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
Spóźniłem się na tę imprezę, ale niedawno zaimplementowałem to z dedykowaną sekcją w pliku konfiguracyjnym dla listy:
i używając,
config.items( "paths" )
aby uzyskać iterowalną listę elementów ścieżki, na przykład:Mam nadzieję, że to pomoże innym osobom szukającym w Google tego pytania;)
źródło
; comment
wypisać określone pozycje z listy bez konieczności przepisywania całej listy.key
, ponieważ ConfigParser konwertuje wszystkie takie klucze na małe literyconfig = ConfigParser.SafeConfigParser()
config.optionxform = str
Wtedy sprawa zostanie samaWiele osób nie wie, że dozwolone są wieloliniowe wartości konfiguracyjne. Na przykład:
Wartość
config.get('hello','barlist')
will będzie teraz wynosić:Które możesz łatwo podzielić metodą podziału linii (nie zapomnij filtrować pustych elementów).
Jeśli spojrzymy na duże ramy, takie jak Pyramid, używają tej techniki:
Źródło
Osobiście może rozszerzyłbym ConfigParser, jeśli jest to typowe dla Ciebie:
Zauważ, że jest kilka rzeczy, na które należy zwrócić uwagę podczas korzystania z tej techniki
źródło
.splitlines()
zamiast.split()
? Używając domyślnego zachowania każdego z nich, split jest wyraźnie lepszy (filtruje puste wiersze). Chyba że czegoś mi brakuje ...Jeśli chcesz dosłownie przekazać listę, możesz użyć:
Na przykład konfiguracja:
Kod to:
wynik:
źródło
ast.literal_eval()
porównaniu do używania (prawdopodobnie bardziej popularnego)json.loads()
? Myślę, że to drugie zapewnia większe bezpieczeństwo, prawda?Żadna wzmianka o
converters
kwargConfigParser()
w żadnej z tych odpowiedzi była raczej rozczarowująca.Zgodnie z dokumentacją możesz przekazać słownik
ConfigParser
, który dodaget
metodę zarówno dla parsera, jak i dla serwerów proxy sekcji. Więc dla listy:example.ini
Przykład parsera:
Jest to mój osobisty faworyt, ponieważ żadne podklasy nie są potrzebne i nie muszę polegać na użytkowniku końcowym, aby doskonale napisał JSON lub listę, którą można zinterpretować
ast.literal_eval
.źródło
Wylądowałem tutaj, chcąc skonsumować to ...
Odpowiedzią jest podzielenie go na przecinek i usunięcie spacji:
Aby uzyskać wynik listy:
Może nie odpowiadać dokładnie na pytanie PO, ale może być prostą odpowiedzią, której niektórzy ludzie szukają.
źródło
[email protected]
! Nic dziwnego, że moja poczta odbijała się dalej! > _ <Oto, czego używam do list:
zawartość pliku konfiguracyjnego:
kod :
działa na strunach
w przypadku liczb
zawartość konfiguracji:
kod:
dzięki.
źródło
Więc innym sposobem, który wolę, jest po prostu podzielenie wartości, na przykład:
Można go załadować w ten sposób do listy ciągów lub liczb całkowitych, w następujący sposób:
Ta metoda zapobiega konieczności zawijania wartości w nawiasach, aby załadować je jako JSON.
źródło
W przypadku serializacji przez analizator konfiguracji obsługiwane są tylko typy pierwotne. Używałbym JSON lub YAML do tego rodzaju wymagań.
źródło
W przeszłości miałem ten sam problem. Jeśli potrzebujesz bardziej złożonych list, rozważ utworzenie własnego parsera poprzez dziedziczenie po ConfigParser. Następnie nadpisałbyś metodę get tym:
Dzięki temu rozwiązaniu będziesz mógł również zdefiniować słowniki w swoim pliku konfiguracyjnym.
Ale bądź ostrożny! To nie jest tak bezpieczne: oznacza to, że każdy może uruchomić kod za pośrednictwem twojego pliku konfiguracyjnego. Jeśli bezpieczeństwo nie jest problemem w twoim projekcie, rozważę użycie bezpośrednio klas Pythona jako plików konfiguracyjnych. Poniższy plik jest znacznie bardziej wydajny i można go stracić niż plik ConfigParser:
źródło
barList=item1,item2
a następnie wywołaćif value.find(',') > 0: return value.split(',')
, lub jeszcze lepiej, pozwolić aplikacji przeanalizować wszystkie opcje konfiguracyjne jako listy i po prostu.split(',')
wszystko na ślepo?Więc teraz mój
config.cfg
plik, który mógłby wyglądać tak:Może zostać przetworzony na drobnoziarniste obiekty - wystarczająco dla mojego małego projektu.
Służy to bardzo szybkiemu analizowaniu prostych konfiguracji, tracisz możliwość pobierania int, bools i innych typów danych wyjściowych bez przekształcania obiektu zwróconego z
Parser
lub ponownego wykonywania zadania przetwarzania wykonanego przez klasę Parser w innym miejscu.źródło
Wykonałem podobne zadanie w moim projekcie z sekcją z kluczami bez wartości:
Wynik:
app.config:
źródło
json.loads
&ast.literal_eval
wydaje się działać, ale prosta lista ciągu config traktuje każdy znak jako bajt więc wracając nawet nawias kwadratowy ....co oznacza, że config ma
fieldvalue = [1,2,3,4,5]
następnie
config.read(*.cfg)
config['fieldValue'][0]
wracając[
w miejsce1
źródło
Jak wspomniał Peter Smit ( https://stackoverflow.com/a/11866695/7424596 ) Możesz chcieć rozszerzyć ConfigParser, a ponadto można użyć Interpolatora do automatycznej konwersji na iz listy.
Dla odniesienia na dole możesz znaleźć kod, który automatycznie konwertuje konfigurację, taki jak:
Więc jeśli poprosisz o klucze, otrzymasz:
Kod:
źródło