如何在 python 中使用 argparse 和 json 文件

Posted

技术标签:

【中文标题】如何在 python 中使用 argparse 和 json 文件【英文标题】:How to use argparse with json files in python 【发布时间】:2021-04-20 20:25:52 【问题描述】:

我正在使用 Python 开发一个项目,并尝试使用 argparse 设置一些参数。当我在终端中键入其中一个时,我从 JSON 文件中获得了一些信息,但我不知道该怎么做。到目前为止,我得到了这些东西:


  "services": [
    
      "name": "ac",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "20%"
    ,
    
      "name": "acc",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "63%"
    ,
    
      "name": "acv",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "37%"
    ,
    
      "name": "acf",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "48%"
    ,
    
      "name": "ach",
      "version": "1.0.8",
      "service": "error",
      "url": "https://portal.azure.com/#home",
      "disk usage": "10%"
    ,
    
      "name": "acj",
      "version": "1.0.8",
      "service": "stopped",
      "url": "https://portal.azure.com/#home",
      "disk usage": "23%"
    ,
    
      "name": "acq",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "65%"
    ,
    
      "name": "bc",
      "version": "1.0.8",
      "service": "stopped",
      "url": "https://portal.azure.com/#home",
      "disk usage": "20%"
    ,
        
      "name": "bcc",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "25%"
    ,
    
      "name": "bcx",
      "version": "1.0.8",
      "service": "error",
      "url": "https://portal.azure.com/#home",
      "disk usage": "4%"
    ,
    
      "name": "bcn",
      "version": "1.0.8",
      "service": "running",
      "url": "https://portal.azure.com/#home",
      "disk usage": "50%"
    ,
    
      "name": "bcm",
      "version": "1.0.8",
      "service": "stopped",
      "url": "https://portal.azure.com/#home",
      "disk usage": "35%"
    
  ]

这是我的 JSON 文件,这些是我的 .py 中的参数:

#argparse parameters config
parser = argparse.ArgumentParser()
parser.add_argument("-f",
                    "--fullreport",
                    help="printing the full report",
                    default="*")
parser.add_argument("-g",
                    "--graphreport",
                    help="printing the graph report",
                    default="*")
parser.add_argument("-s",
                    "--services",
                    help="services to be test",
                    default=["*"])
parser.add_argument("-d",
                    "--diskusage",
                    help="see the disk usage")

args = parser.parse_args()

我有更多代码,但它是打印所有 JSON 文件,其中带有一个 with open 和一个 for 实例,但我想要打印例如使用参数 -s 的服务。

【问题讨论】:

做一个print(args) 看看解析器做了什么(假设它没有引发错误并且相当)。这些属性之一,例如args.s 应该是文件名。只需使用 Python json 文件阅读器来加载和解析该文件。 是完整的json文件吗? 【参考方案1】:

您可以使用for 循环:

def print_service_names(data):
    print('Services:')
    for service in data['services']:
        print(service['name'])

def print_service_disk_usages(data):
    print('Disk Usage:')
    for service in data['services']:
        print(f'service["name"]:\tservice["disk usage"]')

print_service_names(json_data)
print_service_disk_usages(json_data)

输出:

Services:
ac
acc
acv
acf
ach
acj
acq
bc
bcc
bcx
bcn
bcm

Disk Usage:
ac:     20%
acc:    63%
acv:    37%
acf:    48%
ach:    10%
acj:    23%
acq:    65%
bc:     20%
bcc:    25%
bcx:    4%
bcn:    50%
bcm:    35%

如果您打算对数据做一些更高级的事情,您可以使用推导来重塑它:

# format the data with comprehensions
service_names = [service['name']
                 for service in json_data['services']]
disk_usage = service['name']: service['disk usage']
              for service in json_data['services']

from pprint import pprint
pprint(service_names)
pprint(disk_usage)

输出:

['ac',
 'acc',
 'acv',
 'acf',
 'ach',
 'acj',
 'acq',
 'bc',
 'bcc',
 'bcx',
 'bcn',
 'bcm']

'ac': '20%',
 'acc': '63%',
 'acf': '48%',
 'ach': '10%',
 'acj': '23%',
 'acq': '65%',
 'acv': '37%',
 'bc': '20%',
 'bcc': '25%',
 'bcm': '35%',
 'bcn': '50%',
 'bcx': '4%'

【讨论】:

感谢@Tenacious B!我有个问题!!使用此代码运行程序时出现错误。“NameError: name 'json_data' is not defined” 我想我必须定义一些 Json_data。另一个问题是如何将此代码与 argparse 一起使用。示例:我想在终端上放置“name.py -s”来打印服务或 -d 来打印磁盘使用情况。这可能吗? 您将需要更改变量名称以适应您的其余代码 @MaximilianoCorrea json_data 只是我在您的问题中分配给您的json字符串的变量

以上是关于如何在 python 中使用 argparse 和 json 文件的主要内容,如果未能解决你的问题,请参考以下文章

Python Argparse,如何正确组织 ArgParse 代码

如何使用 argparse Python 在 SQL 查询中传递日期范围参数

如何使用 Python 中的 argparse 和 csv 库编写文件?

如何在 Python 中使用 argparse 传递 Shell 脚本样式参数

如何在 CMD 中不传递“python”的情况下使用 argparse?

Pyspark 和使用 UDF:如何将 Python 参数(sys.argv、argparse)传递给 Python Worker?