如何在 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
.
我正在关注 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
.