gpt4 book ai didi

python - JMESPath 日期过滤

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:55 26 4
gpt4 key购买 nike

我正在尝试将 Ansible 脚本转换为 Python AWS lambda 函数。在我的 Python 脚本中,我使用 jmespath library按日期过滤,日期以 ISO 8601 格式的字符串形式给出。

我的过滤器在我的 Ansible 脚本中工作,并且还使用 JMESPath website tool 。我不明白为什么我的 Python 版本不能工作; Ansible 是用 Python 编写的,所以我希望它能以同样的方式工作。

这在 Ansible 中有效:

 - name: parse groups
debug:
msg: "{{ results_gitlabGroupsProjects | to_json | from_json | json_query(projects_query) }}"
vars:
projects_query: "json[?last_activity_at > `{{gitlab_date}}`].{name: name, id: id, last_activity_at: last_activity_at }"
register: gitlabGroupsProjects2

当我尝试在 Python 中执行相同的操作时,我得到一个空列表,[]:

compareTime="2020-01-15T17:55:3S.390Z"
plist2 = jmespath.search('[?last_activity_at > `str(compareTime)`]', project_data )
with open('plist2.json', 'w') as json_file:
json.dump(plist2, json_file)

示例 JSON 数据:

[
{
"name": "test",
"id": 16340975,
"last_activity_at": "2020-01-15T20:12:49.775Z"
},
{
"name": "test1",
"id": 11111111,
"last_activity_at": "2020-01-15T15:57:29.670Z"
},
{
"name": "test2",
"id": 222222,
"last_activity_at": "2020-01-15T23:08:22.313Z"
},
{
"name": "test3",
"id": 133333,
"last_activity_at": "2020-01-15T22:28:42.628Z"
},
{
"name": "test4",
"id": 444444,
"last_activity_at": "2020-01-14T02:20:47.496Z"
},
{
"name": "test5",
"id": 555555,
"last_activity_at": "2020-01-13T04:54:18.353Z"
},
{
"name": "test6",
"id": 66666666,
"last_activity_at": "2020-01-12T07:12:05.858Z"
},
{
"name": "test7",
"id": 7777777,
"last_activity_at": "2020-01-10T20:52:32.269Z"
}
]

使用 Ansible,在 JMESPath 网站上我得到以下输出:

[
{
"name": "test",
"id": 16340975,
"last_activity_at": "2020-01-15T20:12:49.775Z"
},
{
"name": "test2",
"id": 222222,
"last_activity_at": "2020-01-15T23:08:22.313Z"
},
{
"name": "test3",
"id": 133333,
"last_activity_at": "2020-01-15T22:28:42.628Z"
}
]

最佳答案

您不能只将 str(compareTime) 表达式作为字符串文字放入,然后让 Python 理解这就是您想要替换的内容。

在字符串中

'[?last_activity_at > `str(compareTime)`]'

没有什么是动态的;字符 str(compareTime) 对 Python 来说没有特殊含义。

Ansible 中,您使用了特殊语法 {{gitlab_date}} 来告诉 Ansible 以不同方式处理字符串以及 gitlab_date< 的值 变量在将其用作 JMESPath 查询之前被放入此时的字符串中。

在Python中,你需要类似的东西。例如。你可以使用 formatted string literal, or f-string :

plist2 = jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)

字符串文字之前的 f 告诉 Python 查找 {...} 大括号之间的任何表达式,因此 compareTime 被插入放在弦的该点上。这很像 Ansible 语法。

上面产生了您预期的输出:

>>> jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)
[{'name': 'test', 'id': 16340975, 'last_activity_at': '2020-01-15T20:12:49.775Z'}, {'name': 'test2', 'id': 222222, 'last_activity_at': '2020-01-15T23:08:22.313Z'}, {'name': 'test3', 'id': 133333, 'last_activity_at': '2020-01-15T22:28:42.628Z'}]
>>> from pprint import pprint
>>> pprint(_)
[{'id': 16340975,
'last_activity_at': '2020-01-15T20:12:49.775Z',
'name': 'test'},
{'id': 222222,
'last_activity_at': '2020-01-15T23:08:22.313Z',
'name': 'test2'},
{'id': 133333,
'last_activity_at': '2020-01-15T22:28:42.628Z',
'name': 'test3'}]

关于python - JMESPath 日期过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59777876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com