2012-06-15 177 views
1

與python我想將Joomla ini語言文件轉換爲sql。然而,joomla ini文件實際上會遺漏任何部分(例如:[翻譯])python閱讀ini文件

由於rawconfigparser幾乎完成了這項工作,但它需要一個部分,所以我構建了一個名爲[ALL]的'dummy'節的臨時文件:

fout = tempfile.NamedTemporaryFile(delete=True) 
    fin = file(self._inFilename, "r") 
    fout.write("[ALL]\n") 
    for f in fin.read(): 
      fout.write(f) 
    config = ConfigParser.RawConfigParser(allow_no_value=True) 
    config.read(fout.name) 
    for c in config.items("ALL"): 
      self._ini2sql(unicode(c[0]).upper(), unicode('de'), unicode(c[1][1:-1])) 

但是...這是def。不是最優雅的解決方案...任何提示,使更pythonic?

+0

根據[這個問題](http://stackoverflow.com/q/2885190/623518)這似乎是一個體面的做事方式。正如[本答案](http://stackoverflow.com/a/10746467/623518)所建議的,您可以通過使用StringIO稍微改進您的解決方案。或者,使用[this](http://stackoverflow.com/a/9158109/623518)子類到'ConfigParser.RawConfigParser'。 – Chris

回答

2

你可以使用,而不是創建實際文件的StringIO的:

from cStringIO import StringIO 
import shutil 

data = StringIO() 
data.write('[ALL]\n') 
with open(self._infilename, 'r') as f: 
    shutil.copyfileobj(f, data) 
data.seek(0) 
config.readfp(data) 
+0

啊,你快了:)'copyfileobj'很好。 – schlamar

1

您可以使用StringIO代替,這是保持在RAM中的內容:

import cStringIO 

fout = cStringIO.StringIO() 
fout.write("[ALL]\n") 

with open(self._inFilename) as fobj: 
    fout.write(fobj.read()) 
fout.seek(0) 

config = ConfigParser.RawConfigParser(allow_no_value=True) 
config.readfp(fout) 

請注意,有一些優化與您的代碼相反,這對您學習很重要:

  1. 始終安全地關閉 一份文件。這是通過with聲明完成的。
  2. 您正在迭代輸入的每個字符並寫入它。這不是必要的,並且是嚴重的性能缺陷。

作爲替代ConfigParser我真的建議configobj庫,其中有一個更清潔,更Python API(和不需要默認段)。例如:

from configobj import ConfigObj 

config = ConfigObj('myConfigFile.ini') 
config.get('key1') 
config.get('key2') 
+0

thnx ms4py,對於學習點和ConfigObj這個看起來確實更清潔的替代解決方案,我將檢查ConfigObj是否也能夠使用換行符來選擇op值... – Paul