Pitão

Como ler e gravar arquivos INI e Conf usando Python

Como ler e gravar arquivos INI e Conf usando Python
A linguagem de programação Python vem com um módulo integrado útil chamado “ConfigParser”, que pode ser usado para escrever parâmetros de configuração de maneira limpa para aplicativos. O ConfigParser usa uma linguagem de configuração bem definida e estruturada totalmente compatível com os arquivos INI encontrados no Microsoft Windows. Esses arquivos INI também podem ser usados ​​com aplicativos Python em execução no Linux e fornecem uma maneira persistente de armazenar e recuperar valores.

No Linux, é mais comum ver “.arquivos conf ”do que“.ini ”arquivos. Os arquivos conf no Linux são como quaisquer outros arquivos de texto e, portanto, podem ser estruturados de qualquer maneira. Depende do analisador como ele interpreta um “.arquivo conf ”. O módulo ConfigParser do Python pode analisar “.arquivos conf ”também (ou qualquer outra extensão aleatória), desde que esses arquivos sejam definidos em linguagem de configuração compatível com INI. Este artigo irá explicar como ler e escrever “.arquivos conf ”no Linux usando a versão estável mais recente do Python 3. Observe que se você substituir todas as ocorrências de “.conf ”extensão neste artigo com“.extensão ini ”, o resultado seria o mesmo. O processo e o código explicados abaixo também devem ser compatíveis com o Microsoft Windows, com algumas pequenas diferenças. Embora essas diferenças não sejam abordadas neste artigo.

Módulo ConfigParser

O analisador de arquivo de configuração ou ConfigParser é um módulo Python que permite ler e gravar arquivos de configuração usados ​​em aplicativos Python. Conforme explicado acima, este módulo suporta sintaxe de arquivo INI. Um muito simplista “.ini ”/“.arquivo conf ”se parece com este.

[PADRÃO]
som = 1
música = 1
volume = 0.8
resolução = 1920x1080
[Do utilizador]
# som pode ter 0 (falso) e 1 (verdadeiro) como valores possíveis
som = 1
; a música pode ter 0 (falso) e 1 (verdadeiro) como valores possíveis
música = 0
Volume = 0.4
resolução = 1280x720

O exemplo ".O arquivo conf ”acima tem duas seções,“ PADRÃO ”e“ Usuário ”. Normalmente os programas Python são codificados de tal maneira que os valores da seção DEFAULT nunca são alterados. A seção PADRÃO é usada para redefinir os valores gerais ou individuais para os valores padrão. A seção do usuário reflete as alterações feitas por um usuário final que está usando o programa Python. Observe que os nomes das seções podem ser qualquer coisa e não é necessário ter uma seção PADRÃO. No entanto, sempre que a seção “DEFAULT” estiver presente (o nome deve estar em maiúsculas), ela será usada para fornecer valores padrão com segurança se o ConfigParser falhar ao analisar certas variáveis. A lógica para lidar com essas seções, variáveis ​​sob elas e valores de fallback deve ser definida no próprio programa Python. Símbolos como “#” e “;” pode ser usado para denotar comentários em “.arquivos conf ”. Todos os pares de valores-chave no arquivo de configuração não diferenciam maiúsculas de minúsculas, geralmente escritos em minúsculas.

Tratamento de tipos de dados por ConfigParser

Antes de prosseguir com alguns exemplos de ConfigParser, é importante entender o tratamento de tipos de dados por este módulo. Para o ConfigParser, cada pedaço de código escrito ou analisado é uma string. Não pode diferenciar entre números ou qualquer outro formato. Os programadores precisam escrever lógica em seu programa para converter uma string “1234” em número usando int (“1234”) enquanto lêem os dados de um “.arquivo conf ”.

Embora a conversão para números usando o método int e float seja uma tarefa muito fácil, converter para booleano pode ser complicado, pois o Python trata o bool (“qualquer_string”) como verdadeiro. Para superar esse problema, você pode usar instruções condicionais para verificar uma string específica. O módulo ConfigParser também fornece um método chamado “getboolean ()”. Este método pode diferenciar corretamente os valores booleanos 'sim' / 'não', 'ligado' / 'desligado', 'verdadeiro' / 'falso' e '1' / '0', mesmo que sejam strings. O ConfigParser também inclui os métodos getint () e getfloat () para sua conveniência.

Escrevendo e salvando um novo arquivo de configuração usando ConfigParser

Vamos supor que “.O arquivo conf ”mencionado acima não existe e você deseja criá-lo automaticamente na primeira inicialização do programa. O código abaixo criará um novo “settings.conf ”no diretório a partir do qual o programa Python foi executado.

import configparser
config = configparser.ConfigParser ()
config ['DEFAULT'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
config ['Usuário'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
com aberto ('configurações.conf ',' w ') como arquivo de configuração:
config.escrever (configfile)

A primeira instrução no código acima importa o módulo ConfigParser. A segunda instrução cria um objeto semelhante a um dicionário chamado "config". Agora você pode usar a sintaxe de dicionário Python padrão para definir as seções e variáveis ​​incluídas nelas, como fica evidente nas próximas duas instruções. Por último, a declaração “com aberto” cria uma nova “configuração.conf ”e grava seções de configuração no arquivo.

O código acima funciona, mas há um pequeno problema com ele. Ele cria um novo arquivo de configurações toda vez que o programa é executado, resultando na substituição de qualquer edição feita pelo usuário no arquivo de configurações. Para corrigir esse problema, você precisa verificar duas condições:

O código modificado abaixo verificará as duas condições e só criará um novo arquivo de configurações se essas duas condições forem atendidas.

import configparser
importar os
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
config ['Usuário'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
settings_file = os.caminho.dirname (os.caminho.realpath (__ file__))
+ os.set + "configurações.conf "
se não os.caminho.existe (settings_file)
ou os.stat (settings_file).st_size == 0:
com aberto ('configurações.conf ',' w ') como arquivo de configuração:
config.escrever (configfile)

A segunda instrução no código acima importa o módulo “os”. A variável “settings_file” armazena o caminho completo para as “configurações.arquivo conf ”a ser criado no diretório do script Python. A próxima instrução verifica duas condições mencionadas acima. A primeira cláusula da declaração é autoexplicativa. A segunda cláusula verifica se o tamanho do arquivo é “0 bytes”. Um arquivo de zero byte significaria um arquivo vazio sem dados armazenados nele. O resto do código é igual ao primeiro exemplo mencionado acima.

Até agora, os exemplos de código explicados acima salvam o arquivo de configuração no diretório do próprio script Python. No entanto, é uma prática comum e padrão do freedesktop salvar arquivos de configuração no “.config ”na pasta pessoal. O exemplo de código abaixo criará um novo “settings.arquivo conf ”em“ ~ /.config / testapp ”pasta.

import configparser
importar os
 
app_name = "testapp"
config_folder = os.caminho.junte-se (os.caminho.expanduser ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "configurações.conf "
full_config_file_path = os.caminho.juntar (config_folder, settings_file)
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
config ['Usuário'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
 
se não os.caminho.existe (full_config_file_path)
ou os.stat (full_config_file_path).st_size == 0:
com open (full_config_file_path, 'w') como configfile:
config.escrever (configfile)

O código acima é quase igual ao do exemplo anterior, exceto por alterar a localização das “configurações.arquivo conf ”para“ ~ /.config / testapp / settings.conf ”. A variável “config_folder” armazena o caminho completo para a pasta do aplicativo a ser criado em “.config ”(“ ~ /.config / testapp / ”). O “os."declaração makedirs" só criará uma nova pasta de aplicativo se ela ainda não existir. A variável “full_config_file_path” armazena o caminho completo do arquivo de configurações (“~ /.config / testapp / settings.conf ”). O resto do código é autoexplicativo.

Lendo um arquivo de configuração usando o ConfigParser

Analisar um arquivo de configuração é bastante simples. O ConfigParser tenta ler um valor usando os métodos get (), getfloat (), getboolean () ou sintaxe de dicionário. No caso de um erro de chave, os valores da seção DEFAULT ou valores substitutos são usados. É uma boa prática definir a seção DEFAULT ou valores de fallback para evitar erros de chave. Você pode usar instruções try-except também para suprimir erros.

config = configparser.ConfigParser ()
config.ler (full_config_file_path)
 
is_sound_on = config ['Usuário'].getboolean ('som')
volume_level = config ['Usuário'].getfloat ('volume')
resolução = config ['Usuário'] ['resolução']
 
# O valor substituto "False" será ignorado porque já existe uma seção DEFAULT.
# Na ausência da seção DEFAULT, o valor de fallback será devidamente usado.
is_music_on = config ['Usuário'].getboolean ('música', falso)
 
imprimir (is_sound_on, is_music_on, volume_level, resolution)

No exemplo de código acima, “config.read ”declaração é usada para ler dados de um arquivo de configuração. Nas instruções a seguir, vários métodos get integrados e notações de dicionário são usados ​​para ler os dados. Na declaração da variável “is_music_on”, o segundo argumento é o valor de fallback (False). Observe que os valores de fallback terão precedência inferior aos valores definidos na seção DEFAULT. Em termos simples, os valores substitutos não terão efeito quando um par de valores-chave já estiver presente na seção DEFAULT.

Código Completo

Abaixo está o código completo combinando a criação da primeira execução do arquivo de configuração e a leitura do arquivo de configuração.

#! / usr / bin / python3
import configparser
importar os
 
app_name = "testapp"
config_folder = os.caminho.junte-se (os.caminho.expanduser ("~"), '.config ', app_name)
os.makedirs (config_folder, exist_ok = True)
settings_file = "configurações.conf "
full_config_file_path = os.caminho.juntar (config_folder, settings_file)
 
config = configparser.ConfigParser ()
 
config ['DEFAULT'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
config ['Usuário'] = "som": "1", "música": "1",
"volume": "0.8 "," resolução ":" 1920x1080 "
 
se não os.caminho.existe (full_config_file_path)
ou os.stat (full_config_file_path).st_size == 0:
com open (full_config_file_path, 'w') como configfile:
config.escrever (configfile)
 
config.ler (full_config_file_path)
is_sound_on = config ['Usuário'].getboolean ('som')
volume_level = config ['Usuário'].getfloat ('volume')
resolução = config ['Usuário'] ['resolução']
 
# O valor substituto "False" será ignorado porque já existe uma seção DEFAULT.
# Na ausência da seção DEFAULT, o valor de fallback será devidamente usado.
is_music_on = config ['Usuário'].getboolean ('música', falso)
 
imprimir (is_sound_on, is_music_on, volume_level, resolution)

Conclusão

O ConfigParser em Python oferece uma maneira útil de lidar com as configurações de linha de comando e aplicativos GUI Python. Esses arquivos de configuração também podem ser usados ​​como bancos de dados leves baseados em texto, mas podem não ser adequados para tipos de dados avançados, grandes conjuntos de dados e grande número de consultas.

Como capturar e transmitir sua sessão de jogo no Linux
No passado, jogar era considerado apenas um hobby, mas com o tempo a indústria de jogos viu um grande crescimento em termos de tecnologia e número de ...
Melhores jogos para jogar com rastreamento manual
Oculus Quest introduziu recentemente a grande ideia de rastreamento manual sem controladores. Com um número cada vez maior de jogos e atividades que e...
Como mostrar a sobreposição de OSD em aplicativos e jogos Linux em tela cheia
Jogar jogos em tela cheia ou usar aplicativos em modo de tela cheia sem distração pode cortar você das informações relevantes do sistema visíveis em u...