我想将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 GeoJsonStr
打印出来自[]
的空argv[1:]
切片。所以我可能错误地将json字符串传递给python脚本。后续错误是:
coordinates = data['coordinates']
TypeError: list indices must be integers, not str
这可能或多或少是因为无法解码。
答案 0 :(得分:1)
当您使用管道将数据发送到程序时,您可以通过stdin访问数据,而不是作为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)。
在您的特定情况下,您可以像上面的示例一样直接读取标准输入,或直接将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]]]}