2017-06-12 16 views
1

私は、jqというLinuxの出力を解析して、jq json strをデコードしてそれを処理するpythonスクリプトを作りたいと思っています。入力argv jsonの文字列を解析する

jqコールjq '.geometry' myJson.jsonの出力は次のようなものです:

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) 
:私はPythonオブジェクトへの出力JSON文字列をデコードして、物事を行う小規模のpythonの実行可能ファイルを書かれている

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

これは私がそれを呼び出す方法です:

jq '.geometry' geoJson.json | myPythonProgram 

しかし私は上の私のコードスニペットに記載されているようにいくつかのpythonエラーが発生しています。私はそれが私のpython実行可能ファイルにjqの出力を渡している方法だと思っています。どういうわけか、json文字列全体がargv引数として取り上げられていません。

私の最初のエラーは、print GeoJsonStrが、argv[1:]から空の[]スライスをプリントアウトすることです。だから私はおそらく間違ってpythonスクリプトにjsonの文字列を渡している。後続のエラーがある:

coordinates = data['coordinates'] 

TypeError: list indices must be integers, not str

デコードするものは何もなかったので、これはおそらく、多かれ少なかれです。

+0

ますもしあなたが直接、上記の例のようにSTDIN読み、またはjson.loadの引数として直接sys.stdinを渡すことができ、あなたの特定のケースでは

エラーが表示されたら、ここにそれらを含める必要があります。 – Carcigenicate

+0

おそらく、[bashでpythonスクリプトを "pipeable"にする方法は?](https://stackoverflow.com/questions/4429966/how-to-make-a-python-script-pipeable-in- bash)おそらくその質問が役に立ちます –

答えて

1

パイプを使用してプログラムにデータを送信すると、argvではなく、stdinを使用してデータにアクセスできます。例えば

、あなたは次のプログラムだったとします

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)が含まれています。

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