这在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的语法与缩进非常相似,在一行上不能很好地工作。特别是,包括with
和if
在内的许多语句之前不能有任何其他语句(特别是,我相信任何缩进的语句,即带有尾随冒号的语句(。因此,无论是在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