Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python JMESPath日期筛选_Python_Json_Ansible_Jmespath - Fatal编程技术网

Python JMESPath日期筛选

Python JMESPath日期筛选,python,json,ansible,jmespath,Python,Json,Ansible,Jmespath,我正在尝试将Ansible脚本转换为Python AWS lambda函数。在我的Python脚本中,我使用以日期过滤,日期以ISO 8601格式的字符串形式给出 我的过滤器在我的Ansible脚本中工作,并使用。我不明白为什么我的Python版本不起作用;Ansible是用Python编写的,所以我希望它能以同样的方式工作 这在Ansible中起作用: - name: parse groups debug: msg: "{{ results_gitlabGroup

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

我的过滤器在我的Ansible脚本中工作,并使用。我不明白为什么我的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数据:

[
{
“名称”:“测试”,
“id”:16340975,
“最后一次活动时间”:“2020-01-15T20:12:49.775Z”
},
{
“名称”:“test1”,
“id”:11111111,
“最后一次活动时间”:“2020-01-15T15:57:29.670Z”
},
{
“名称”:“test2”,
“id”:22222,
“最后一次活动时间”:“2020-01-15T23:08:22.313Z”
},
{
“名称”:“test3”,
“id”:133333,
“最后一次活动时间”:“2020-01-15T22:28:42.628Z”
},
{
“名称”:“test4”,
“id”:444444,
“最后一次活动时间”:“2020-01-14T02:20:47.496Z”
},
{
“名称”:“test5”,
“id”:555555,
“最后一次活动时间”:“2020-01-13T04:54:18.353Z”
},
{
“名称”:“test6”,
“id”:6666,
“最后一次活动时间”:“2020-01-12T07:12:05.858Z”
},
{
“名称”:“test7”,
“id”:777,
“最后一次活动时间”:“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中,您需要使用类似的东西。例如,您可以使用:

字符串文本之前的
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'}]

您不能仅仅将
str(compareTime)
表达式作为字符串文本放入,并让Python理解这正是您想要替换的内容

串连

'[?last_activity_at > `str(compareTime)`]'
没有什么是动态的;字符
str(compareTime)
对Python没有特殊意义

在Ansible中,您使用了特殊的语法,
{{gitlab_date}
,告诉Ansible以不同的方式对待字符串,
gitlab_date
变量的值在将其用作JMESPath查询之前放置在该字符串中

在Python中,您需要使用类似的东西。例如,您可以使用:

字符串文本之前的
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'}]

f字符串确实解决了我当前的问题,并且过滤器在这种情况下可以工作。当涉及到额外的过滤时,f字符串有一个挑战。jmespath确实为高级过滤器使用了花括号,例如:[?last_activity_at>
{compareTime}
].{name:name,id:id,last_activity_at:last_activity_at},但您可以将其分成两行代码。使用上述解决方案,然后执行[].{name:name,id:id,last_activity_at:last_activity_at}.@modevops三个选项:双文字大括号(
{
}
在最后一个字符串中变为单大括号),或使用;举例来说,这并不依赖于花括号。或者使用字符串连接:
(f“[?last_activity_at>`{compareTime}]”。{name:name,id:id,last_activity_at:last_activity_at}”)
使用两个字符串,其中只有一个作为f字符串,但会生成一个值。f字符串确实解决了我当前的问题,并且过滤器在这种情况下可以工作。当涉及到额外的过滤时,f字符串有一个挑战。jmespath确实为高级过滤器使用了花括号,例如:[?last_activity_at>
{compareTime}
].{name:name,id:id,last_activity_at:last_activity_at},但您可以将其分成两行代码。使用上述解决方案,然后执行[].{name:name,id:id,last_activity_at:last_activity_at}.@modevops三个选项:双文字大括号(
{
}
在最后一个字符串中变为单大括号),或使用;举例来说,这并不依赖于花括号。或者使用字符串连接:
(f“[?last_activity_at>`{compareTime}]”。{name:name,id:id,last_activity_at:last_activity_at}”)
使用两个字符串,其中只有一个作为f字符串,但生成一个值。