解析输入argv json字符串

时间:2017-06-12 23:21:22

标签: python json linux

我想将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

这可能或多或少是因为无法解码。

1 个答案:

答案 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]]]}