1

使用 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]))

但是...这是定义。不是最优雅的解决方案......有什么技巧可以让这个更pythonic吗?

4

3 回答 3

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)
于 2012-06-15T08:31:40.220 回答
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') 
于 2012-06-15T08:34:06.233 回答
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"])
于 2019-08-23T21:35:04.810 回答