如何将参数从命令行传递到python脚本,以读取和更新json文件中某些键的值



我在json文件(例如.json(中有某些数据,

example.json

data = {
'name'   :  'Williams',
'working':  False,
'college':  ['NYU','SU','OU'],
'NYU'    :  {
'student'  : True,
'professor': False,
'years'    : {
'fresher'  : '1',
'sophomore': '2',
'final'    : '3'
}
}
}

我想写一个代码,在那里我可以在命令行上给出参数,即假设如果脚本保存在文件"script.py"中,那么,

在终端中:如果我输入*$ python3* script.py --get name --get NYU.student,则它输出name=Williams

NYU.student=True

如果我输入*$ python3* script.py' --set name=Tom --set NYU.student=False

然后,它将dictionay中的name和NYU.student密钥更新为Tom和False,并在命令行上输出NYU.student=TomNYU.student=False

我已经为python脚本(即script.py(尝试了以下代码

script.py

import json
import pprint
import argparse

if __name__== "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--get", help="first command")
parser.add_argument("--set", help="second command")

args=parser.parse_args()
with open('example.json','r') as read_file:
data=json.load(read_file)


if args.set == None:
key = ' '.join(args.get[:])
path = key.split('.')
now = data
for k in path:
if k in now:
now = now[k]
else:
print('Error: Invalid Key')
print(now)  
elif args.get == Null:
key, value = ' '.join(args.set[:]).split('=')
path = key.split('.')
now = data
for k in path[:-1]:
if k in now:
now = now[k]
else:
print('Error: Invalid Key')
now[path[-1]] = value

with open('example.json','w') as write_file:    #To write the updated data back to the same file
json.dump(data,write_file,indent=2)

然而,我的脚本并没有像我预期的那样工作?请帮我写脚本

您的代码存在以下问题:

  1. 将第23行和第35行的参数值连接起来时,需要使用空格。这导致了";错误键";价值删除空间将解决问题
key = ''.join(arg[:])
  1. 您将参数定义为只传递一个值。不是多个。因此,即使传递多个--get--set值,脚本也只能获得一个值。将action="append"添加到第9行和第10行将解决该问题
parser.add_argument("--get", help="first command", action="append")
parser.add_argument("--set", help="second command", action="append")

完整代码:

import json
import pprint
import argparse

if __name__== "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--get", help="first command", action="append")
parser.add_argument("--set", help="second command", action="append")

args=parser.parse_args()
try:
with open('example.json','r') as read_file:
data=json.load(read_file)
except IOError:
print("ERROR: File not found")
exit()

if args.set == None:
for arg in args.get:

key = ''.join(arg[:])

path = key.split('.')
now = data
for k in path:
if k in now:
now = now[k]
else:
print('Error: Invalid Key')
print(f"{arg} = {now}")  
elif args.get == None:
for arg in args.set:
key, value = ''.join(arg[:]).split('=')

path = key.split('.')
now = data
for k in path[:-1]:
if k in now:
now = now[k]
else:
print('Error: Invalid Key')
print(f"{arg}")
now[path[-1]] = value


with open('example.json','w') as write_file:    #To write the updated data back to the same file
json.dump(data,write_file,indent=2)

这是问题的get部分,我希望你能继续你的作业的set部分。祝好运

python test.py --get name NYU.student

import json
import pprint
import argparse
def match(data: dict, filter: str):
current = data
for f in filter.split("."):
if f not in current:
return False
current = current[f]

return current == True

if __name__== "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--get", nargs="*", help="first command")
args = parser.parse_args()
with open('example.json','r') as f:
data = json.loads(f.read())
if args.get is not None and len(args.get) == 2:
attr_name = args.get[0]
if match(data, args.get[1]):
print("{}={}".format(attr_name, data[attr_name]))

为了使用命令行传递参数,请使用python3中的sys模块。sys模块以字符串列表的形式读取命令行参数。列表中的第一个元素始终是文件名,随后的元素是arg1、arg2。。。。。等等。

希望下面的例子有助于理解sys模块的用法。

示例命令:

python filename.py 1 thisisargument2 4

对应的代码

import sys
# Note that all the command line args will be treated as strings
# Thus type casting will be needed for proper usage
print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])
print(sys.argv[3])    

对应输出

filename.py 
1 
thisisargument2 
4

此外,在stackoverflow上发布问题之前,请在谷歌上进行彻底搜索。

相关内容

  • 没有找到相关文章

最新更新