170 votes

Comment lire et écrire un fichier INI avec Python3 ?

Je dois lire, écrire et créer un 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!!' )

MISE À JOUR FILE.INI

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

7 votes

2 votes

En fait, que diriez-vous de stackoverflow.com/a/3220891/716118 ?

1 votes

Un fichier ini digne de ce nom doit comporter un titre de section tel que [foobar] .

7voto

Sardathrion Points 1690

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

  • Sections imbriquées (sous-sections), à n'importe quel niveau
  • Valeurs de la liste
  • Valeurs de lignes multiples
  • Interpolation de chaînes de caractères (substitution)
  • Intégration d'un puissant système de validation comprenant la vérification automatique du type/la conversion des sections répétées et l'autorisation des 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 "reload")
  • Prise en charge complète de l'Unicode

Elle présente quelques inconvénients :

  • Vous ne pouvez pas définir le délimiteur, il doit être = ( demande d'extraction )
  • On ne peut pas avoir de valeurs vides, enfin si, mais elles ont l'air de ressembler à ce qu'elles sont : fuabr = au lieu de fubar ce qui semble bizarre et erroné.

2voto

Il y a quelques problèmes que j'ai trouvé quand j'ai utilisé configparser comme - J'ai eu une erreur quand j'ai essayé de récupérer la valeur d'un paramètre :

destination= \my -serveur \backup $%USERNAME

C'est parce que l'analyseur ne peut pas obtenir cette valeur avec le caractère spécial '%'. J'ai donc écrit un parseur pour lire les fichiers ini en me basant sur le module 're' :

import re

# read from ini file.
def ini_read(ini_file, key):
    value = None
    with open(ini_file, 'r') as f:
        for line in f:
            match = re.match(r'^ *' + key + ' *= *.*$', line, re.M | re.I)
            if match:
                value = match.group()
                value = re.sub(r'^ *' + key + ' *= *', '', value)
                break
    return value

# read value for a key 'destination' from 'c:/myconfig.ini'
my_value_1 = ini_read('c:/myconfig.ini', 'destination')

# read value for a key 'create_destination_folder' from 'c:/myconfig.ini'
my_value_2 = ini_read('c:/myconfig.ini', 'create_destination_folder')

# write to an ini file.
def ini_write(ini_file, key, value, add_new=False):
    line_number = 0
    match_found = False
    with open(ini_file, 'r') as f:
        lines = f.read().splitlines()
    for line in lines:
        if re.match(r'^ *' + key + ' *= *.*$', line, re.M | re.I):
            match_found = True
            break
        line_number += 1
    if match_found:
        lines[line_number] = key + ' = ' + value
        with open(ini_file, 'w') as f:
            for line in lines:
                f.write(line + '\n')
        return True
    elif add_new:
        with open(ini_file, 'a') as f:
            f.write(key + ' = ' + value)
        return True
    return False

# change a value for a key 'destination'.
ini_write('my_config.ini', 'destination', '//server/backups$/%USERNAME%')

# change a value for a key 'create_destination_folder'
ini_write('my_config.ini', 'create_destination_folder', 'True')

# to add a new key, we need to use 'add_new=True' option.
ini_write('my_config.ini', 'extra_new_param', 'True', True)

2voto

Fabio Caccamo Points 6

Vous pouvez utiliser python-benedict Il s'agit d'une sous-classe de dict qui fournit un support d'E/S normalisé pour les formats les plus courants, y compris les formats ini .

from benedict import benedict

# path can be a ini string, a filepath or a remote url
path = 'path/to/config.ini'

d = benedict.from_ini(path)

# do stuff with your dict
# ...

# write it back to disk
d.to_ini(filepath=path)

Il est bien testé et documenté, consultez le README pour voir toutes les fonctionnalités :

Documentation : https://github.com/fabiocaccamo/python-benedict

Installation : pip install python-benedict

Note : Je suis l'auteur de ce projet

1voto

MoRoff Points 29

Utiliser des dictionnaires imbriqués. Jetez un coup d'œil :

Fichier INI : example.ini

[Section]
Key = Value

Code :

class IniOpen:
    def __init__(self, file):
        self.parse = {}
        self.file = file
        self.open = open(file, "r")
        self.f_read = self.open.read()
        split_content = self.f_read.split("\n")

        section = ""
        pairs = ""

        for i in range(len(split_content)):
            if split_content[i].find("[") != -1:
                section = split_content[i]
                section = string_between(section, "[", "]")  # define your own function
                self.parse.update({section: {}})
            elif split_content[i].find("[") == -1 and split_content[i].find("="):
                pairs = split_content[i]
                split_pairs = pairs.split("=")
                key = split_pairs[0].trim()
                value = split_pairs[1].trim()
                self.parse[section].update({key: value})

    def read(self, section, key):
        try:
            return self.parse[section][key]
        except KeyError:
            return "Sepcified Key Not Found!"

    def write(self, section, key, value):
        if self.parse.get(section) is  None:
            self.parse.update({section: {}})
        elif self.parse.get(section) is not None:
            if self.parse[section].get(key) is None:
                self.parse[section].update({key: value})
            elif self.parse[section].get(key) is not None:
                return "Content Already Exists"

Appliquer le code comme suit :

ini_file = IniOpen("example.ini")
print(ini_file.parse) # prints the entire nested dictionary
print(ini_file.read("Section", "Key") # >> Returns Value
ini_file.write("NewSection", "NewKey", "New Value"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X