2010-09-06 7 views
1

J'utilise ConfigParser pour enregistrer des paramètres simples dans un fichier .ini et l'un de ces paramètres est un répertoire. Chaque fois que je remplace une chaîne de répertoire telle que D:/Documents/Data, avec une chaîne de répertoire plus courte telle que D:/, les caractères restants sont placés deux lignes sous l'option. Donc, le fichier .ini ressemble maintenant à ceci:Problème de remplacement des chaînes déjà existantes avec ConfigParser

[Settings] 
directory = D:/ 

Documents/Data 

Qu'est-ce que je fais mal? Voici mon code:

import ConfigParser 

class Settings(): 
    self.config = ConfigParser.ConfigParser() 

    def SetDirectory(self, dir): #dir is the directory string 
     self.config.readfp(open('settings.ini')) 
     self.config.set('Settings', 'directory', dir) 
     with open('settings.ini', 'r+') as configfile: self.config.write(configfile) 

Répondre

1

L'option r+ (dans le open dans le with) est de dire Python pour conserver le fichier contenu précédent de, tout en écrasant les octets spécifiques qui seront écrits à elle, mais en laissant tous les autres seuls. Utilisez w pour ouvrir un fichier pour complet écraser, ce qui semble être ce que vous devriez faire ici. Remplacer des octets sélectionnés dans un fichier existant est très rarement ce que vous voulez faire, en particulier pour les fichiers texte, que vous avez plus tendance à voir comme une séquence de lignes de texte, plutôt que des paquets d'octets! (Il peut être utile dans des cas très spécialisés, impliquant principalement de gros fichiers binaires, où la vue by-byte peut avoir un sens). L'organisation en ligne avec laquelle nous aimons voir les fichiers texte n'est pas reflétée dans le système de fichiers sous-jacent (sur tout système d'exploitation qui est actuellement populaire, au moins - dans le passé signifiait imiter des paquets de cartes perforées, par exemple, chaque ligne devait donc avoir exactement 80 octets, ni plus, ni moins ... mais c'est un lointain souvenir ancien, tout au plus, pour la grande majorité des programmeurs et utilisateurs d'ordinateurs aujourd'hui;-). Donc, "écraser une partie d'un fichier sur place" (où le fichier contient des lignes de texte de différentes longueurs) devient un problème. Si vous avez besoin de le faire, comptez le module fileinput de la librairie standard Python, qui reproduit avec beaucoup de compétence cette opération souvent demandée, mais exécutant le système de fichiers. Mais, cela ne vous aiderait pas beaucoup dans ce cas, où l'écrasement total simple semble être exactement correct ;-).

Questions connexes