在 Python 中使用具有不同变量类型的 ConfigParser
Use ConfigParser with different variable types in Python
我正在尝试在以下情况下使用 ConfigParser
。我是 运行 一些代码,之后我有一个具有多个属性的对象。我挑选出其中一些属性并将它们写入 .ini
文件 configparser
。这工作正常,我的 .ini
文件看起来像这样。
[Section]
path = "D:\"
number = 10.0
boolean = False
然后我想使用其他一些脚本读取文件并将项目作为属性添加到另一个对象(自身)使用。
parser.read('file.ini')
self.__dict__.update(dict(parser.items("Section")))
这失败了,因为所有值都被 configparser 读取为字符串,现在所有属性都是字符串。 parser.items("Section")
看起来像这样:
[('path', '"D:\"'), ('number', '10.0'), ('boolean', 'False')]
现在我可以通过键指定浮点数、整数和布尔值,并使用相应的方法 parser.getfloat
、getint
和 getboolean
来获得正确的 python 输入。但是,这意味着制作一个额外的键列表和一个循环来为每种数据类型获取它们,这是我不想要的。此外,即使路径现在是双引号,我也需要开始删除引号。
这种行为使 ConfigParser
对我来说几乎完全没有价值,我怀疑我是否正确使用它,如果 ConfigParser
是实现我的目标的最佳选择,它只是编写对象属性到文件,稍后读取文件并将参数作为属性添加到新对象。我可以有效地使用 ConfigParser
吗?还是我应该开始寻找其他方法?
INI 不是 JSON。没有数据类型。有部分和 key/value 对。 =
之前的内容是键,之后的内容是值。一切都是文字。
没有"strings",这意味着不需要双引号。 "escaped" 反斜杠也是如此。 INI文件格式不存在转义的概念。
所以,首先,您的文件应该如下所示:
[Section]
path = D:\
number = 10.0
boolean = False
其次,我认为这是一个危险的操作
parser.read('file.ini')
self.__dict__.update(dict(parser.items("Section")))
因为它可能会使用文本文件中可能包含垃圾的任意值来破坏您的 class 实例,但是当您可以发誓该文件将始终正常时,好吧,如果必须的话,请执行此操作。
我会写一个更明确的方式来读取和验证配置数据。我感觉到您不这样做的原因是懒惰或错误的简单感;这两个理由都不太好
如果您想要一种半自动的类型转换方式,请使用数据类型标记键。
[Section]
s_path = D:\
f_number = 10.0
b_boolean = False
并编写一个知道如何处理它们并在出现问题时抛出的函数。
def type_convert(items):
result = []
for (key, value) in items:
type_tag = key[:2]
if type_tag == "s_":
result.append((key[2:], value))
elif type_tag == "f_":
result.append((key[2:], float(value)))
elif type_tag == "b_":
result.append((key[2:], bool(value)))
else:
raise ValueError('Invalid type tag "%s" found in ini file.' % type_tag)
# alternatively: "everything else defaults to string"
return result
你可以使用它来使操作更方便一些:
self.__dict__.update(dict(type_convert(parser.items("Section"))))
当然,您仍然 运行 通过覆盖不应被覆盖的键来破坏您的 class 实例的风险。
我正在尝试在以下情况下使用 ConfigParser
。我是 运行 一些代码,之后我有一个具有多个属性的对象。我挑选出其中一些属性并将它们写入 .ini
文件 configparser
。这工作正常,我的 .ini
文件看起来像这样。
[Section]
path = "D:\"
number = 10.0
boolean = False
然后我想使用其他一些脚本读取文件并将项目作为属性添加到另一个对象(自身)使用。
parser.read('file.ini')
self.__dict__.update(dict(parser.items("Section")))
这失败了,因为所有值都被 configparser 读取为字符串,现在所有属性都是字符串。 parser.items("Section")
看起来像这样:
[('path', '"D:\"'), ('number', '10.0'), ('boolean', 'False')]
现在我可以通过键指定浮点数、整数和布尔值,并使用相应的方法 parser.getfloat
、getint
和 getboolean
来获得正确的 python 输入。但是,这意味着制作一个额外的键列表和一个循环来为每种数据类型获取它们,这是我不想要的。此外,即使路径现在是双引号,我也需要开始删除引号。
这种行为使 ConfigParser
对我来说几乎完全没有价值,我怀疑我是否正确使用它,如果 ConfigParser
是实现我的目标的最佳选择,它只是编写对象属性到文件,稍后读取文件并将参数作为属性添加到新对象。我可以有效地使用 ConfigParser
吗?还是我应该开始寻找其他方法?
INI 不是 JSON。没有数据类型。有部分和 key/value 对。 =
之前的内容是键,之后的内容是值。一切都是文字。
没有"strings",这意味着不需要双引号。 "escaped" 反斜杠也是如此。 INI文件格式不存在转义的概念。
所以,首先,您的文件应该如下所示:
[Section]
path = D:\
number = 10.0
boolean = False
其次,我认为这是一个危险的操作
parser.read('file.ini')
self.__dict__.update(dict(parser.items("Section")))
因为它可能会使用文本文件中可能包含垃圾的任意值来破坏您的 class 实例,但是当您可以发誓该文件将始终正常时,好吧,如果必须的话,请执行此操作。
我会写一个更明确的方式来读取和验证配置数据。我感觉到您不这样做的原因是懒惰或错误的简单感;这两个理由都不太好
如果您想要一种半自动的类型转换方式,请使用数据类型标记键。
[Section]
s_path = D:\
f_number = 10.0
b_boolean = False
并编写一个知道如何处理它们并在出现问题时抛出的函数。
def type_convert(items):
result = []
for (key, value) in items:
type_tag = key[:2]
if type_tag == "s_":
result.append((key[2:], value))
elif type_tag == "f_":
result.append((key[2:], float(value)))
elif type_tag == "b_":
result.append((key[2:], bool(value)))
else:
raise ValueError('Invalid type tag "%s" found in ini file.' % type_tag)
# alternatively: "everything else defaults to string"
return result
你可以使用它来使操作更方便一些:
self.__dict__.update(dict(type_convert(parser.items("Section"))))
当然,您仍然 运行 通过覆盖不应被覆盖的键来破坏您的 class 实例的风险。