2010-10-28 67 views
9

我想使用解析時間和運行時插值的configobj配置文件的值。在Python中執行簡單字符串插值的最簡單方法是"%(foo)s" % somedict。不幸的是,configobj使用相同的插值機制,我還沒有找到一種方法來逃避它。理想情況下,我的價值如下:如何在configobj值中轉義%符號?

othervar = foo 
someconfigobjkey = %(othervar)s %%(runtimevar)s 

但是,configobj嘗試(並失敗)替換第二個變量。解決這個問題的另一種方法是提供一種不同的(configobj)方法來執行解析時間和運行時間插值。

回答

1

答案的新版本:

你可以使用「」 .format()(Python的2.6以上)或string.Template(是Python 2.4或以上)的運行時間插值 - 兩者都將消除衝突。

(舊版本假定使用標準configparser模塊用來的,因此評論。)

+0

正如我在我的第一個問題中所述,我使用configobj而不是ConfigParser。也許我認爲這個模塊被稱爲太遠無論如何它可以在http://www.voidspace.org.uk/python/configobj.html找到。 – 2010-10-28 14:50:48

+0

所以瑞,我不知道這個模塊,也沒有在你的文章中將它識別爲模塊名稱。任何不使用標準ConfigParser模塊的原因?如果這也能爲你做好,那麼問題也將得到解決:) – 2010-10-28 14:55:31

+0

在企業發展中,並不總是選擇工具。 – 2010-10-28 14:57:29

3

是的,不幸的是configobj不按照正常的標準Python格式規則,所以%%,這本來是正確的方法逃避百分號,失敗。對我來說似乎有點設計缺陷。

我能想到的有一個configobj值文字%(foo)s序列的唯一方法是確保自身通過替換生成的序列的一部分:

>>> import configobj 
>>> c= configobject.ConfigObj() 
>>> c['foo']= 'bar' 
>>> c['pc']= '%' 
>>> c['v']= '%(foo)s %(pc)s(foo)s' 
>>> c['v'] 
'bar %(foo)s' 
2

挖我發現文檔中更深比bobince提出的解決方案更適合:使用不同的插值引擎,如interpolation="template"。它有兩個優點。

  1. 不會干擾%符號。
  2. 支持轉義。 ($$被插入到$。)

的例子看起來像:

othervar = foo 
someconfigobjkey = $othervar %(runtimevar)s 
+0

這是使用的方法!請注意'cfg = configobj.ConfigObj(...,interpolation ='template')'似乎對驗證沒有影響,後面的'cfg.validate(...)'仍然會失敗。通過設置'configobj.DEFAULT_INTERPOLATION ='template'',可以改變默認的插補器。這適用於Python 2和Python 3. – 2017-04-12 09:45:37

3

嘗試使用 '%' + '(富)S'。在處理ConfigParser時,這對我有用。

8

自發布此問題以來可能發生了變化,但我發現您可以使用'%'字符轉義。這在Python 3

爲我工作在我的config.ini文件:

[LOGGING] 
format = %%(asctime)-15s %%(message)s 

在我的Python腳本文件:

import configparser 

# Load configuration 
config = configparser.ConfigParser() 
config.read("config.ini") 

log_config = config['LOGGING'] 

print(log_config['format']) # prints out '%(asctime)-15s %(message)s' 

希望它可以幫助別人的未來(:

+0

這對SafeConfigParser適合我! – 2016-03-08 01:40:42