使用ConfigParser读取没有节名的文件
我正在使用 ConfigParser 来读取脚本的运行时配置。
我希望具有不提供部分名称的灵活性(有些脚本足够简单;它们不需要“部分”)。 ConfigParser
将抛出 NoSectionError
异常,并且不会接受该文件。
如何使 ConfigParser 简单地检索配置文件的 (key, value)
元组而无需部分名称?
例如:
key1=val1
key2:val2
我宁愿不写入配置文件。
I am using ConfigParser
to read the runtime configuration of a script.
I would like to have the flexibility of not providing a section name (there are scripts which are simple enough; they don't need a 'section'). ConfigParser
will throw a NoSectionError
exception, and will not accept the file.
How can I make ConfigParser simply retrieve the (key, value)
tuples of a config file without section names?
For instance:
key1=val1
key2:val2
I would rather not write to the config file.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
您可以在一行代码中完成此操作。
(但 tomllib 可能是更好的选择。请参阅我答案的底部。)
在 python 3 中,在您的配置文件数据中添加一个假节头,并将其传递给
read_string()
< /a>.您还可以使用
itertools.chain()
< /a> 模拟read_file() 的节标题
。这可能比上述方法更节省内存,如果您在受限的运行时环境中有大型配置文件,这可能会有所帮助。在 python 2 中,在配置文件数据前面添加一个假节标头,将结果包装在 < code>StringIO 对象,并将其传递给
readfp()
。使用任何这些方法,您的配置设置都将在
parser.items('top')
中可用。您也可以在 python 3 中使用 StringIO,也许是为了与新旧 python 解释器兼容,但请注意,它现在位于 io 包中,并且 readfp() 是现在已弃用。
或者,您可以考虑使用 TOML 解析器而不是 ConfigParser。 Python 3.11 在标准库中添加了解析器: tomllib
You can do this in a single line of code.
(But tomllib is probably a better choice. See the bottom of my answer.)
In python 3, prepend a fake section header to your config file data, and pass it to
read_string()
.You could also use
itertools.chain()
to simulate a section header forread_file()
. This might be more memory-efficient than the above approach, which might be helpful if you have large config files in a constrained runtime environment.In python 2, prepend a fake section header to your config file data, wrap the result in a
StringIO
object, and pass it toreadfp()
.With any of these approaches, your config settings will be available in
parser.items('top')
.You could use StringIO in python 3 as well, perhaps for compatibility with both old and new python interpreters, but note that it now lives in the
io
package andreadfp()
is now deprecated.Alternatively, you might consider using a TOML parser instead of ConfigParser. Python 3.11 added a parser to the standard library: tomllib
Alex Martelli 提供了一个解决方案使用 ConfigParser 解析 .properties 文件(显然是无节配置文件)。
他的解决方案是一个类似文件的包装器,它将自动插入一个虚拟节标题以满足
ConfigParser
的要求。Alex Martelli provided a solution for using
ConfigParser
to parse.properties
files (which are apparently section-less config files).His solution is a file-like wrapper that will automagically insert a dummy section heading to satisfy
ConfigParser
's requirements.受到 jterrace 的回答的启发,我提出了这个解决方案:
为未来的 Google 用户进行编辑:从 Python 3.4+ 开始,
readfp
已弃用,并且不再需要StringIO
。相反,我们可以直接使用read_string
:Enlightened by this answer by jterrace, I come up with this solution:
EDIT for future googlers: As of Python 3.4+
readfp
is deprecated, andStringIO
is not needed anymore. Instead we can useread_string
directly:您可以使用 ConfigObj 库来简单地做到这一点:http://www.voidspace.org。 uk/python/configobj.html
更新:此处查找最新代码。
如果您使用的是 Debian/Ubuntu,您可以使用包管理器安装此模块:
使用示例:
You can use the ConfigObj library to do that simply : http://www.voidspace.org.uk/python/configobj.html
Updated: Find latest code here.
If you are under Debian/Ubuntu, you can install this module using your package manager :
An example of use:
在我看来,最简单的方法是使用 python 的 CSV 解析器。这是演示此方法的读/写函数以及测试驱动程序。如果值不允许是多行的话,这应该可以工作。 :)
The easiest way to do this is to use python's CSV parser, in my opinion. Here's a read/write function demonstrating this approach as well as a test driver. This should work provided the values are not allowed to be multi-line. :)
我自己也遇到了这个问题,我为 ConfigParser (Python 2 中的版本)编写了一个完整的包装器,它可以透明地读取和写入没有节的文件,基于 Alex Martelli 的方法(链接到已接受的答案)。它应该是 ConfigParser 任何用法的直接替代品。发布它以防任何需要的人找到此页面。
Having ran into this problem myself, I wrote a complete wrapper to ConfigParser (the version in Python 2) that can read and write files without sections transparently, based on Alex Martelli's approach linked on the accepted answer. It should be a drop-in replacement to any usage of ConfigParser. Posting it in case anyone in need of that finds this page.
Blueicefield的答案提到了configobj,但原始lib仅支持Python 2。它现在有Python 3+兼容端口:
https: //github.com/DiffSK/configobj
API 没有改变,看它是 文档。
Blueicefield's answer mentioned configobj, but the original lib only supports Python 2. It now has a Python 3+ compatible port:
https://github.com/DiffSK/configobj
APIs haven't changed, see it's doc.
Python 的开发版本(3.13)终于支持不带节的文件。
https://docs.python.org/3.13/library/configparser。 html#unnamed-sections
The development version of Python (3.13) finally support files without sections.
https://docs.python.org/3.13/library/configparser.html#unnamed-sections