【问题标题】:Parsing complicated string-based configuration options解析复杂的基于字符串的配置选项
【发布时间】:2021-04-20 21:29:52
【问题描述】:

我正在尝试构建一个 Python 程序来解析来自 Universe 数据库的转换代码。这些转换代码是编码大量信息的高密度字符串,我正在努力开始。转换代码的不同排列可能数以十万计(尽管我没有计算过)。

我对@9​​87654322@ 很熟悉,但是我想不出用argparse 处理这种解析的方法,而且我的Google-fu 也没有想出任何其他解决方案。

最初,我的懒惰工作是只为最常见的转换代码进行字典查找,但现在我们使用这个 Python 程序来获取更多数据,维护每个单独的转换代码变得很麻烦。

例如,日期转换代码可能采用如下形式:

  • 日期:D[n][*m][s][fmt[[f1, f2, f3, f4, f5]]][E][L],例如D2/D4-2/RM
  • 日期时间:DT[4|D|4D|T|TS|Z][;timezone],例如DTZDT4;America/Denver
  • 日期时间 ISO:DTI[B][R|W][S][Z][2|1|0][;[timezone|offset]],例如DTIBZ2DTIR;America/Denver

还有一堆其他的转换代码,参数同样复杂。

我的最终目标是能够将 Universe 的字符串数据转换为适当的 Python 对象并再次转换回来,为此,我需要了解这些转换代码。

如果有帮助,我不需要验证这些转换代码。一旦它们被设置在数据库中,它们就会在那里得到验证。

【问题讨论】:

  • 除非您将这些转换代码作为命令行参数接收,否则我看不到 argparse 在这里的相关性。如果是这种情况,argparse 没有内置类型来处理这些代码,但您可以创建一个解析函数,供自定义 argparse 类型使用。您能否提供一些说明或解释转换代码的文档的链接?这将允许不熟悉 Universe 转换代码的用户提供帮助。请为解析函数提供一些示例输入和预期输出。
  • 如果你已经有一段时间了,你可能不知道 UOPY,因为我认为它是在去年年底发布的。pypi.org/project/uopy 它知道它具有 ICONV 和 OCONV 功能,我认为这会让你在哪里你想成为而无需维护任何东西。
  • @VanAmburg 我对 UOPY 很熟悉,但不幸的是它不能满足我的需要。也许我遗漏了一些东西,但我遇到的问题是 UOPY 和 U2PY 都只是将数据作为字符串返回,而且我无法(除了转换代码)了解它们实际包含的对象。同样,当我去写回数据时,我需要知道正确的字符串格式给 Universe,否则它不能正确存储数据。一个很好的例子是日期/时间:我想“读取”一个字段并获取一个 Python 日期时间对象,同样我想写入一个日期时间对象。
  • 您可以使用转换代码作为底层数据结构应该是什么的提示。在您的示例中,如果代码以 DT 开头,它应该是 UTC 时间戳,您可以完全忽略转换并使用 datetime.utcfromtimestamp 获取对象。您可能会丢失一些上下文,但理想情况下,上下文在您工作的级别上并不重要。根据您当前的地图检查基本指南背面的转换代码列表。你很可能会关心 Ms 和 Ds。对 MD 要非常小心,因为那是钱的去向。祝你好运。

标签: python data-conversion universe


【解决方案1】:

我建议您使用 readnamedfields/writenamedfields 方法,这将返回 OCONV 数据,当您回写时它会处理 ICONV。

导入 u2py 帮助(u2py.File.readnamedfields) 关于模块 u2py 中函数 readnamedfields 的帮助:

readnamedfields(self, *args) F.readnamedfields(recordid, fieldnnames, [lockflag]) -> new DynArray object -- 通过文件中记录的名称读取指定的字段

fieldnames is a u2py.DynArray object with each of its fields being a name defined in the dictionary file
lockflag is either 0 (default), or [LOCK_EXCLUSIVE or LOCK_SHARED] [ + LOCK_WAIT]

note: if fieldnames contains names that are not defined in the dictionary, these names are replaced by @ID and no exception is raised

【讨论】:

  • 谢谢迈克。这就是我已经在做的事情,也是我遇到问题的地方:我唯一得到的是一个字符串。当我处理日期时间对象时,这尤其成问题。并非所有 Universe 日期/时间 oconv 都由 Python 日期时间库自动解析。如果我尝试写入 Universe 的 datetime 对象包含额外数据(如毫秒),u2py 将无法静默写入而不写入任何内容。
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多