Python:读取配置文件,每个键有多行

Python:读取配置文件,每个键有多行,python,configuration-files,text-parsing,sql,Python,Configuration Files,Text Parsing,Sql,我正在编写一个小型DB测试套件,用于读取带有查询和预期结果的配置文件,例如: query = "SELECT * from cities WHERE name='Unknown';" count = 0 level = 1 name = "Check for cities whose name should be null" suggested_fix = "UPDATE cities SET name=NULL WHERE na

我正在编写一个小型DB测试套件,用于读取带有查询和预期结果的配置文件,例如:

query         = "SELECT * from cities WHERE name='Unknown';"
count         = 0
level         = 1
name          = "Check for cities whose name should be null"
suggested_fix = "UPDATE cities SET name=NULL WHERE name='Unknown';"
这很有效;我使用Python的
string.partition('=')
划分每一行

我的问题是很长的SQL查询。目前,我只是将这些查询粘贴为一行,这既难看又无法维护

我想找到一种优雅、通俗的方式来解读一个表达式的右边,即使它跨越了许多行

注:

  • 我的SQL查询可能包含
    =
  • 我不喜欢在右侧强制使用
    s,因为有许多现有文件没有它
编辑:

很好,但它迫使我在多行条目的每一行的开头添加空格或制表符。这可能是一个很大的痛苦

提前感谢,


Adam默认情况下,Python标准库模块支持此功能。配置文件必须采用标准格式:

[Long Section]
short: this is a normal line
long: this value continues
    in the next line
可以使用以下代码读取上面的配置文件:

import ConfigParser
config = ConfigParser.ConfigParser()
config.read('longsections.cfg')
long = config.get('Long Section', 'long')

我建议您使用一个正则表达式……代码可能如下所示,为您提供了一个开始:

import re

test="""query = "select * from cities;"
count = 0
multine_query = "select *
from cities
     where name='unknown';"
"""

re_config = re.compile(r'^(\w+)\s*=\s*((?:".[^"]*")|(?:\d+))$', re.M)
for key, value in re_config.findall(test):
    if value.startswith('"'):
        value = value[1:-1]
    else:
        value = int(value)
    print key, '=', repr(value)
此示例的输出为:

~> python test.py 
query = 'select * from cities;'
count = 0
multine_query = "select *\nfrom cities\n     where name='unknown';"
希望有帮助

问候,,
Christoph

这几乎正是促使我们转向(,;您可能希望将其视为替代方案)的用例。YAML与或相比有一些优势:

  • 人类可读性(对于较大的文件,优于JSON)
  • 可以序列化任意python对象(这使得它与
    pickle
    一样不安全,但是python实现中有一个
    safe\u load
    函数来缓解这个问题)。这对于像
    datetime
    对象这样简单的对象已经很有用了
为完整起见,主要缺点(IMO):

  • Python实现比JSON实现慢一个数量级
  • 跨平台的可移植性不如JSON
比如说

import yaml

sql = """
query         : "SELECT * from cities
WHERE name='Unknown';"
count         : 0
level         : 1
name          : "Check for cities whose name should be null"
suggested_fix : "UPDATE cities SET name=NULL WHERE name='Unknown';"
"""

sql_dict = yaml.safe_load(sql)

print(sql_dict['query'])
印刷品

SELECT * from cities WHERE name='Unknown';

此空格/制表符未包含在最终值中。您能详细说明吗?我不理解您的评论。+1应该可以,但我更喜欢支持各种边缘条件的现成软件包。我对此解决方案有问题,因为解析文件时会出现错误。根据文档,对于多行值,缩进是无效的我在“下一行”的开头加了4个空格,效果很好。