gpt4 book ai didi

python - 解析输入 argv json 字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:23 25 4
gpt4 key购买 nike

我想将 linux jq 调用的输出解析为 python 脚本,该脚本将解码输出 jq json str 并用它做一些事情。

我的 jq 调用 jq '.geometry' myJson.json 的输出是这样的:

{
"coordinates": [
[
[
5,
2
],
[
5.4,
3
],
[
3,
2.1
]
]
],
"crs": {
"properties": {
"name": "foo"
},
"type": "name"
},
"type": "Polygon"
}

我写了一个小的 python 可执行文件,它将输出的 json 字符串解码为 python 对象,然后执行以下操作:

import collections
import json
import sys
import logging

if __name__ == '__main__':

try:
geoJsonStr = str(sys.argv[1:])
print geoJsonStr ## This for some reason only prints an empty slice '[]'
data = json.loads(geoJsonStr)
coordinates = data['coordinates'] ## TypeError: list indices must be integers, not str
## Do things here

except ValueError as e:
logging.error(e.message)
exit(1)

我是这样调用它的:

jq '.geometry' geoJson.json | myPythonProgram

但是,如我上面的代码片段中所述,我遇到了一些 Python 错误。我在想这就是我将 jq 输出传递到我的 python 可执行文件中的方式。不知何故,整个 json 字符串没有被提取为 argv 参数。

我的第一个错误是 print GeoJsonStrargv[1:] 打印出一个空的 [] 切片。所以我可能错误地将 json 字符串传递给了 python 脚本。随后的错误是:

coordinates = data['coordinates']

TypeError:列表索引必须是整数,而不是 str

这可能或多或少是因为没有什么可解码的。

最佳答案

当您使用管道向程序发送数据时,您可以通过标准输入访问数据,而不是作为 argv 中的参数。

例如,假设您有以下程序:

foo.py:

import sys
data = sys.stdin.read()
print "I got", len(data), "characters!"

通过管道将一些数据输入其中会给你这样的输出:

$ echo "foobar" | python foo.py
I got 6 characters!

请注意,在此示例中,对 python 的调用包含一个与输入完全分开的参数 (foo.py)。

在您的特定情况下,您可以像上面的示例一样直接读取 stdin,或者将 sys.stdin 作为参数直接传递给 json.load:

import sys
...
obj = json.load(sys.stdin)
print obj

输出应该是这样的:

$ jq '.geometry' geoJson.json | python myPythonProgram.py
{u'crs': {u'type': u'name', u'properties': {u'name': u'foo'}}, u'type': u'Polygon', u'coordinates': [[[5, 2], [5.4, 3], [3, 2.1]]]}

关于python - 解析输入 argv json 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44510069/

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