2009-02-19 4 views
1

Basé sur le module ConfigParser, comment puis-je filtrer et lancer tous les commentaires d'un fichier ini?Commentaires sur le lancement de Python - ConfigParser

import ConfigParser 
config = ConfigParser.ConfigParser() 
config.read("sample.cfg") 

for section in config.sections(): 
    print section 
    for option in config.options(section): 
     print option, "=", config.get(section, option) 

par ex. dans le fichier ini ci-dessous le script de base ci-dessus imprime les autres lignes de commentaires, ainsi que:

something = 128  ; comment line1 
         ; further comments 
         ; one more line comment 

Ce que je dois avoir est que les noms des sections et des paires pure valeur clé à l'intérieur sans les commentaires. ConfigParser gère-t-il cela ou dois-je utiliser regexp ... ou? Cheers

+1

Que signifie "jeter"? Veuillez fournir une déclaration claire de ce que vous essayez réellement de faire - pourquoi avez-vous besoin de "jeter" les données d'un fichier? Où est-ce que ça va? Que reste-t-il derrière? –

Répondre

5

selon docs lignes commençant par ; ou # seront ignorés. il ne semble pas que votre format réponde à cette exigence. pouvez-vous par hasard changer le format de votre fichier d'entrée?

modifier: puisque vous ne pouvez pas modifier vos fichiers d'entrée, je vous suggère de les pré-analyse avec quelque chose le long des lignes:

tmp_fname = 'config.tmp' 
with open(config_file) as old_file: 
    with open(tmp_fname, 'w') as tmp_file: 
     tmp_file.writelines(i.replace(';', '\n;') for i in old_lines.readlines()) 
# then use tmp_fname with ConfigParser 

évidemment, si point-virgule est présente dans les options que vous aurez être plus créatif.

2

Il semble que vos commentaires ne se trouvent pas sur les lignes commencent avec le chef de commentaire. Cela devrait fonctionner si le chef de commentaire est le premier personnage sur la ligne.

+0

Merci, mais malheureusement je ne suis pas autorisé à modifier le fichier ini d'entrée.Dans ce format de fichier ini comme je l'ai remarqué toutes les lignes de commentaires sont ajoutées à la partie valeur de la dernière clé - sauf la première ligne de commentaire est tombé en effet. –

+0

En fait, ma tâche est de comparer deux fichiers ini (chaque partie significative sauf les commentaires) –

+0

Ensuite, vous devrez probablement créer un fichier temporaire et/ou utiliser ConfigParser.readfp() pour mettre au rebut les commentaires. – sykora

3

La meilleure façon est d'écrire un messages contenant file sous-classe:

class CommentlessFile(file): 
    def readline(self): 
     line = super(CommentlessFile, self).readline() 
     if line: 
      line = line.split(';', 1)[0].strip() 
      return line + '\n' 
     else: 
      return '' 

Vous pouvez l'utiliser ensuite avec ConfigParser (code):

import ConfigParser 
config = ConfigParser.ConfigParser() 
config.readfp(CommentlessFile("sample.cfg")) 

for section in config.sections(): 
    print section 
    for option in config.options(section): 
     print option, "=", config.get(section, option) 
+0

Je pense qu'il y a une petite faute de frappe là-bas, elle devrait être super (CommentlessFile, self) .readline(), au lieu de CommentRemover. – sykora

+0

@sykora: J'ai réparé cela 5 secondes après le premier post :) – nosklo

1

Comme le doc a dit: « (Pour la compatibilité ascendante , seulement, commence un commentaire en ligne, alors que # ne le fait pas.) "Alors utilisez"; " et non "#" pour les commentaires en ligne. Cela fonctionne bien pour moi.

0

Python 3 est livré avec une solution intégrée: La classe configparser.RawConfigParser a l'argument constructeur inline_comment_prefixes. Exemple:

class MyConfigParser(configparser.RawConfigParser): 
    def __init__(self): 
     configparser.RawConfigParser.__init__(self, inline_comment_prefixes=('#', ';')) 
Questions connexes