如何在 python 中使用 运行 jq 命令?

How to run jq command in python?

我正在关注 bigquery 地理空间指南,我的 json 文件是通过 jq 命令更改的。特别是这个:

cat ~/file1.json | jq -c '.features[]' > converted.json

我遇到了 运行 与上述 python 相同的困难。我正在使用 subprocess 模块,但它不起作用。

cmd = ['cat', './sample.json', '|', 'c', '.features[]']

print(subprocess.check_output(cmd))

我得到的输出是这样的:

cat: |: No such file or directory
cat: -c: No such file or directory
cat: .features[]: No such file or directory
Traceback (most recent call last):
  File "/Users/rtom/kml2geo/main.py", line 12, in <module>
    result = subprocess.check_output(cmd)
  File "/Users/rtom/opt/anaconda3/lib/python3.8/subprocess.py", line 415, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/Users/rtom/opt/anaconda3/lib/python3.8/subprocess.py", line 516, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['cat', './sample.json', '|', '-c', '.features[]']' returned non-zero exit status 1.
(base) rtom@Ryans-MacBook-Pro kml2geo %

这里有什么帮助吗?

你不需要cat(你永远从单个文件读取时需要cat;它的目的是连接 多个输入源在一起)。把它拿出来,一切都变得简单多了:

subprocess.run(['jq', '-c', '.features[]'],
               stdin=open(os.path.expanduser('~/file1.json'), 'r'),
               stdout=open('converted.json', 'w'))

您还可以通过传递输入文件名来避免 stdin= 参数(在将 ~ 替换为完全限定路径之后,因为没有 shell 可以为您完成此操作) 在 jq 的命令行上:

subprocess.run(['jq', '-c', '.features[]',
                os.path.expanduser('~/file1.json')
               ], stdout=open('converted.json', 'w'))

如果您想将输出读取到变量而不是将其写入文件,请取出 stdout= 参数并添加 capture_output=True.