2010-08-10 93 views
1

任何人都知道如何编辑ini文件值,最好使用ConfigParser? (或者甚至是一个开始的地方会很棒!)我在整个配置文件中都有很多评论,所以我想通过编辑值来保留它们,而不是采取值和多个文件一起玩。我的配置文件的使用ConfigParser编辑ini文件选项值(Python)

结构:

[name1] 
URL = http://example.com 
username = dog 
password = password 

[name2] 
URL = http://catlover.com 
username = cat 
password = adffa 

正如你所看到的,我已经得到了不同部分的名称相同的选项,所以编辑只为一个部分的值是有点棘手,如果ConfigParser不能这样做。

在此先感谢。

回答

2

下面是一个例子

import sys 
import os.path 
from ConfigParser import RawConfigParser as ConfParser 
from ConfigParser import Error 

p = ConfParser() 
# this happend to me save as ASCII 
o = open("config.ini") 
if o.read().startswith("\xef\xbb\xbf"): 
    print "Fatal Error; Please save the file as ASCII not unicode." 
    sys.exit() 
try: 
    results = p.read("config.ini") 
except Error, msg: 
    print "Error Parsing File" 
    print msg 
else: 
    if results == []: 
     print "Could not load config.ini." 
     if not os.path.exists("config.ini"): 
      print "config.ini does not exist." 

     else: 
      print "An uknown error occurred." 

    else: 
     print "Config Details" 
     sections = p.sections() 
     sections.sort() 
     for s in sections: 
      print "------------------------" 
      print s 
      if p.has_option(s, "URL"): 
       print "URL: ", 
       print p.get(s, "URL") 

      else: 
       print "URL: No Entry" 

      if p.has_option(s, "username"): 
       print "User: ", 
       print p.get(s, "username") 

      else: 
       print "User: N/A" 

      if p.has_option(s, "password"): 
       print "Password: ", 
       print p.get(s, "password") 

      else: 
       print "Password: N/A" 

此外,我创建了这个类来存储我的应用程序变量等,也使配置写容易原先被扭曲使用,但我创建了一个简单的替换记录

import os.path 
import sys 
#from twisted.python import log 
import ConfigParser 
from traceback import print_last 
class Log(object): 

    def msg(t): 
     print "Logger: %s " % t 

    def err(t = None): 
     print "-------------Error-----------" 
     print "\n\n" 
     if t is None: 
      print_last() 
# sloppy replacement for twisted's logging functions 
log = Log()    
class Settings(object): 
    '''Stores settings''' 
    config_variables = ['variables_that_should_be_stored_in_config'] 
    def __init__(self, main_folder = None, log_file = None, music_folder = None): 
     # load the defaults then see if there are updates ones in the config 
     self.load_defaults() 
     self.config = ConfigParser.RawConfigParser() 
     if len(self.config.read(self.settings_file)) == 1: 
      if 'Settings' in self.config.sections(): 
       try: 
        self.music_folder = self.config.get('Settings', 'music_folder') 
       except ConfigParser.NoOptionError: 
        pass 
       log.msg('Music Folder: %s' % self.music_folder) 
       try: 
        self.mplayer = self.config.get('Settings', 'mplayer') 
       except ConfigParser.NoOptionError: 
        pass 
       try: 
        self.eula = self.config.getboolean('Settings', 'eula') 
       except ConfigParser.NoOptionError: 
        pass 
      else: 
       log.msg('No Settings Section; Defaults Loaded') 
     else: 
      log.msg('Settings at default') 
    def load_defaults(self): 
     log.msg('Loading Defaults') 
     self.main_folder = os.path.dirname(os.path.abspath(sys.argv[0])) 
     self.settings_file = os.path.join(self.main_folder, 'settings.cfg') 
     self.log_file = os.path.join(self.main_folder, 'grooveshark.log') 
     self.music_folder = os.path.join(self.main_folder, 'Music') 
     self.grooveshark_started = False 
     self.eula = False 
     self.download_percent = 0.5# default buffer percent is 50 % 
     if sys.platform == 'win32' or sys.platform == 'cygwin':# Windows 
      if os.path.exists(os.path.join(self.main_folder, 'mplayer', 'mplayer.exe')): 
       self.mplayer = os.path.join(self.main_folder, 'mplayer', 'mplayer.exe') 
      elif os.path.exists(os.path.join(self.main_folder, '/mplayer.exe')): 
       self.mplayer = os.path.join(self.main_folder, '/mplayer.exe') 
      else: 
       self.mplayer = 'download' 

     elif sys.platform == 'darwin':# Mac 
      if os.path.exists(os.path.join(self.main_folder, 'mplayer/mplayer.app')): 
       self.mplayer = os.path.join(self.main_folder, 'mplayer/mplayer.app') 
      elif os.path.exists(os.path.join(self.main_folder, '/mplayer.app')): 
       self.mplayer = os.path.join(self.main_folder, '/mplayer.app') 
      else: 
       self.mplayer = 'download' 
     else:# linux 
      # download or navigate to it 
      self.mplayer = 'download' 

     # Create Music Folder if it does not exist 
     if not os.path.exists(self.music_folder): 
      os.makedirs(self.music_folder) 
     # Create log file if it does not exist 
     if not os.path.exists(self.log_file): 
      l = open(self.log_file, 'wb') 
      l.close() 

     log.msg('Application Folder: %s' % self.main_folder) 
     log.msg('Log File: %s' % self.log_file) 
     log.msg('Music Folder: %s' % self.music_folder) 

    def __setattr__(self, variable, value): 
     log.msg('Setting %s to %s' % (variable, value)) 
     object.__setattr__(self, variable, value) 
     if variable in self.config_variables: 
      try: 
       self.config.set('Settings', variable, value) 
      except: 
       # Means config wasn't created then, could be we were trying to set self.config (in which case self.config wasn't set yet because we were trying to set it) 
       log.err() 
      else: 
       # UPDATE settings file 
       log.msg('Saving Settings to %s' % (self.settings_file)) 
       try: 
        self.config.write(open(self.settings_file, 'wb')) 
       except: 
        log.err() 
+0

从我可以告诉你的代码,它不会真的为我工作。我已经获得了许多使用配置文件的代码(读取和写入)。但我的问题是,我需要为ie改变一个值。 '[name2]'节中的'URL'。我需要它,以便该部分不会移动到任何地方。我试图弄清楚如何做:'def editAcct(section,option,oldValue,newValue)',并让它改变选择的部分。 – avacariu 2010-08-10 05:34:30

+0

雅你使用set方法,而不是get方法(相同的语法加上一个更多的参数值)请参阅:http://docs.python.org/library/configparser.html – Zimm3r 2010-08-11 21:25:41

+0

所以我再看看这个问题,我意识到'set'方法不起作用,因为我需要保持所有的注释不变。我最终实现了我自己的方式,它在文件中找到段名(按行号)和下一段;那么它会在两个节名称之间找到具有值的行;改变;并重写整个文件。它能够保留我需要的评论。无论如何感谢您的答案! – avacariu 2010-08-30 00:41:02