Comment lire et écrire un fichier INI avec Python3?


118

J'ai besoin de lire, écrire et créer un fichier INI avec Python3.

FILE.INI

default_path = "/path/name/"
default_file = "file.txt"

Fichier Python:

#    Read file and and create if it not exists
config = iniFile( 'FILE.INI' )

#    Get "default_path"
config.default_path

#    Print (string)/path/name
print config.default_path

#    Create or Update
config.append( 'default_path', 'var/shared/' )
config.append( 'default_message', 'Hey! help me!!' )

FILE.INI MIS À JOUR

default_path    = "var/shared/"
default_file    = "file.txt"
default_message = "Hey! help me!!"


2
En fait, qu'en est-il de stackoverflow.com/a/3220891/716118 ?
voithos

un fichier ini approprié a besoin d'un en-tête de section comme [foobar].
Martin Thoma

Réponses:


148

Cela peut être quelque chose pour commencer:

import configparser

config = configparser.ConfigParser()
config.read('FILE.INI')
print(config['DEFAULT']['path'])     # -> "/path/name/"
config['DEFAULT']['path'] = '/var/shared/'    # update
config['DEFAULT']['default_message'] = 'Hey! help me!!'   # create

with open('FILE.INI', 'w') as configfile:    # save
    config.write(configfile)

Vous pouvez en trouver plus dans la documentation officielle du configparser .


4
Donne configparser.MissingSectionHeaderErrorlors de l'utilisation des fichiers d'exemple fournis sans les en-têtes de section appropriés.
Jaakko

81

Voici un exemple complet de lecture, de mise à jour et d'écriture.

Fichier d'entrée, test.ini

[section_a]
string_val = hello
bool_val = false
int_val = 11
pi_val = 3.14

Code de travail.

try:
    from configparser import ConfigParser
except ImportError:
    from ConfigParser import ConfigParser  # ver. < 3.0

# instantiate
config = ConfigParser()

# parse existing file
config.read('test.ini')

# read values from a section
string_val = config.get('section_a', 'string_val')
bool_val = config.getboolean('section_a', 'bool_val')
int_val = config.getint('section_a', 'int_val')
float_val = config.getfloat('section_a', 'pi_val')

# update existing value
config.set('section_a', 'string_val', 'world')

# add a new section and some values
config.add_section('section_b')
config.set('section_b', 'meal_val', 'spam')
config.set('section_b', 'not_found_val', '404')

# save to a file
with open('test_update.ini', 'w') as configfile:
    config.write(configfile)

Fichier de sortie, test_update.ini

[section_a]
string_val = world
bool_val = false
int_val = 11
pi_val = 3.14

[section_b]
meal_val = spam
not_found_val = 404

Le fichier d'entrée d'origine reste intact.


Sur mon système Python 3.7, la ligne "config.set ('section_b', 'not_found_val', 404)" a dû être remplacée par "config.set ('section_b', 'not_found_val', str (404))" car le les paramètres pour "set" doivent être des chaînes. Excellent exemple, merci!
Mr Ed

ressemble à la read méthode renvoie maintenant une liste de fichiers lus / fichier, mais pas le contenu
YTerle


5

La norme ConfigParsernécessite normalement un accès via config['section_name']['key'], ce qui n'est pas amusant. Une petite modification peut fournir un accès aux attributs:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

AttrDictest une classe dérivée de dictlaquelle permet l'accès via les clés du dictionnaire et l'accès aux attributs: cela signifiea.x is a['x']

Nous pouvons utiliser cette classe dans ConfigParser:

config = configparser.ConfigParser(dict_type=AttrDict)
config.read('application.ini')

et maintenant nous obtenons application.ini:

[general]
key = value

comme

>>> config._sections.general.key
'value'

6
belle astuce, mais les utilisateurs de cette méthode doivent faire attention, que lors d'un accès comme config._sections.general.key = "3"celui-ci ne change pas la valeur interne de l'option de configuration et ne peut donc être utilisée que pour un accès en lecture seule. Si après la .read()commande la configuration est étendue ou modifiée (ajouter des options, des paires de valeurs pour certaines sections, -> qui effectue une interpolation ce qui peut être très important) cette méthode d'accès ne doit pas être utilisée! De plus, tout accès config._sections["section"]["opt"]dont est privé évite l'interpolation et renvoie les valeurs brutes!
Gabriel

5

ConfigObj est une bonne alternative à ConfigParser qui offre beaucoup plus de flexibilité:

  • Sections imbriquées (sous-sections), à tous les niveaux
  • Liste des valeurs
  • Plusieurs valeurs de ligne
  • Interpolation de chaîne (substitution)
  • Intégré à un système de validation puissant comprenant la vérification automatique du type / conversion des sections répétées et autorisant les valeurs par défaut
  • Lors de l'écriture des fichiers de configuration, ConfigObj préserve tous les commentaires et l'ordre des membres et des sections
  • De nombreuses méthodes et options utiles pour travailler avec les fichiers de configuration (comme la méthode 'recharger')
  • Prise en charge complète d'Unicode

Il a quelques inconvénients:

  • Vous ne pouvez pas définir le délimiteur, il doit être =… ( pull request )
  • Vous ne pouvez pas avoir de valeurs vides, eh bien, vous pouvez mais elles ont l'air appréciées: fuabr =au lieu de simplement celles fubarqui semblent bizarres et erronées.

1
Sardathrion a raison, ConfigObj est la voie à suivre si vous souhaitez conserver les commentaires dans le fichier et l'ordre des sections comme dans le fichier d'origine. ConfigParser effacera simplement vos commentaires et brouillera également la commande à un moment donné.
Lève

2

contenu de mon fichier backup_settings.ini

[Settings]
year = 2020

code python pour la lecture

import configparser
config = configparser.ConfigParser()
config.read('backup_settings.ini') #path of your .ini file
year = config.get("Settings","year") 
print(year)

pour écrire ou mettre à jour

from pathlib import Path
import configparser
myfile = Path('backup_settings.ini')  #Path of your .ini file
config.read(myfile)
config.set('Settings', 'year','2050') #Updating existing entry 
config.set('Settings', 'day','sunday') #Writing new entry
config.write(myfile.open("w"))

production

[Settings]
year = 2050
day = sunday

Cela fonctionne comme un charme et est propre!
Rodrigo.A92 il y a
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.