使用python我想将Joomla ini语言文件转换为sql。然而,joomla ini文件实际上错过了任何部分(例如:[translations])
由于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 :(得分: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)
答案 1 :(得分: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)
请注意,与您的代码相比,有一些优化,这对您来说非常重要:
with
语句完成的。作为ConfigParser
的替代方案,我建议使用configobj
库,它具有更清晰,更pythonic的API(并且不需要默认部分)。例如:
from configobj import ConfigObj
config = ConfigObj('myConfigFile.ini')
config.get('key1')
config.get('key2')
答案 2 :(得分:0)
读取当前目录中的.ini文件
import configparser
import os
ini_file = configparser.ConfigParser()
ini_file_path = os.path.join(os.path.dirname(__file__),"filename.ini")
ini_file.read(ini_file_path) # ini_file as a dictionary
print (ini_file["key1"])