2010-08-10 91 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