如何用python-c标志更新json文件



这在python shell中有效,但当我用python -c执行它时,这里的语法错误是什么?

我只需要更新文件myjson.json中的一个值

python3.6 -c "import json; with open('myjson.json', 'r+') as jsonFile:  data = json.load(jsonFile); data['root']['target']['branch'][0] = 'updated_value'; jsonFile.seek(0); json.dump(data, jsonFile, indent=4); jsonFile.truncate()"
File "<string>", line 1
import json; with open('myjson.json', 'r+') as jsonFile:  data = json.load(jsonFile);  data['root']['target']['branch'][0] = 'updated_value'; jsonFile.seek(0); json.dump(data, jsonFile, indent=4); jsonFile.truncate()
^
SyntaxError: invalid syntax

Python的语法与缩进非常相似,在一行上不能很好地工作。特别是,包括withif在内的许多语句之前不能有任何其他语句(特别是,我相信任何缩进的语句,即带有尾随冒号的语句(。因此,无论是在Python外壳、Python脚本还是-c参数中,这都是无效的:

a = 1; if a == 1: print(a)

必须写成

a = 1
if a == 1: print(a)

a = 1
if a == 1:
print(a)

如果要从shell传递这样的程序,则必须在-c参数中传递一行换行符。例如,在bash:中

python3 -c $'a = 1nif a == 1: print(a)'

(bash语法$'...'引用字符串的方式可以识别n等控制序列。(

编辑:这是这个问题的字面答案。DYZ在评论中绝对正确地指出,试图将Python混合成一行代码并不是一种很好的做法。制作脚本文件是有意义的。如果出于任何原因你不能,使用heredoc将大大提高可读性:

cat << EOF | python3
a = 1
if a == 1:
print(a)
EOF

EDIT2:如果你可以不使用Python,那么有更好的工具可以更新JSON文件中的值。最简单的是jq,它存在的全部原因是操纵JSON:

jq '.root.target.branch[0] = "updated_value"' myjson.json

最新更新