python读取ini文件

python读取ini文件,python,Python,使用python,我想将Joomla ini语言文件转换为sql。然而,joomla ini文件实际上遗漏了任何部分(例如:[翻译]) 由于rawconfigparser几乎完成了这项工作,但它需要一个部分,因此我构造了一个临时文件,其中包含一个名为[ALL]的“虚拟”部分: fout = tempfile.NamedTemporaryFile(delete=True) fin = file(self._inFilename, "r") fout.write("[ALL]

使用python,我想将Joomla ini语言文件转换为sql。然而,joomla ini文件实际上遗漏了任何部分(例如:[翻译])

由于rawconfigparser几乎完成了这项工作,但它需要一个部分,因此我构造了一个临时文件,其中包含一个名为[ALL]的“虚拟”部分:

    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吗?

您可以使用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)
您可以改为使用,即将内容保留在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
    的替代方案,我真的建议使用这个库,它有一个更干净、更具Python风格的API(并且不需要默认的部分)。例如:

    from configobj import ConfigObj
    
    config = ConfigObj('myConfigFile.ini')
    config.get('key1') 
    config.get('key2') 
    

    正在读取当前目录中的.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"])
    

    按照这个说法,这似乎是一种体面的做事方式。您可以使用StringIO稍微改进您的解决方案,如的建议。或者使用子类来
    ConfigParser.RawConfigParser
    .Argh,你更快了:)
    copyfileobj
    很好。thnx ms4py,对于学习点和使用ConfigObj的替代解决方案,它看起来确实更干净,我将检查ConfigObj是否也能够选择带有新行的op值。。。