Python - 将字典和键值列表转换为字符串
Python - Convert List Of Dictionaries & Key Values To String
取下面的字典和键值对列表:
[{'name': 'test-project',
'properties': {'name': 'test-project',
'parent': {'id': '', 'type': 'folder'},
'projectId': 'test-project'},
'type': 'cloudresourcemanager.v1.project'},
{'metadata': {'dependsOn': ['test-project']},
'name': 'billing_test-project',
'properties': {'billingAccountName': 'billingAccountName',
'name': 'projects/test-project'},
'type': 'deploymentmanager.v2.virtual.projectBillingInfo'},
{'name': 'apis',
'properties': {'apis': ['compute.googleapis.com'],
'billing': 'billing_test-project',
'concurrent_api_activation': True,
'project': 'test-project'},
'type': 'apis.py'},
{'name': 'service-accounts',
'properties': {'project': 'test-project',
'service-accounts': ''},
'type': 'service-accounts.py'},
{'action': 'gcp-types/compute-v1:compute.projects.setUsageExportBucket',
'metadata': {'dependsOn': ['test-project',
'test-project-compute.googleapis.com']},
'name': 'set-export-bucket',
'properties': {'bucketName': 'gs://usage-exports',
'project': 'test-project',
'reportNamePrefix': 'usage_gce_'}}]}
我需要将其转换为以下语法:
资源:\n- 名称:test-project\n 属性:\n 名称:test-project\n 父级:\n id:\n 类型:folder\n
我想在我的简短 Google 搜索之后,也许像下面这样的东西会起作用:
'\n'.join(d for d in resources)
不幸的是,这给了我错误:
"TypeError: sequence item 0: expected str instance, dict found"
如有任何帮助,我们将不胜感激。
(作为旁注,Google 的配置内容是字符串的唯一示例是用于创建 VM:https://cloud.google.com/deployment-manager/docs/deployments#api;我注意到空格似乎随着每个键的增加而增加值对,但我不完全确定这里是否真的需要)。
编辑:
抱歉,我的意思是说我需要与以下格式类似的键值对,作为字符串:
resource = "resources:\n- name: vm-created-by-cloud-config\n type: compute.v1.instance\n properties:\n zone: us-central1-a\n machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n disks:\n - deviceName: boot\n type: PERSISTENT\n boot: true\n autoDelete: true\n initializeParams:\n diskName: disk-created-by-cloud-config\n sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20151104\n networkInterfaces:\n - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default\n"
因此,打印时,它看起来像这样:
resources:
- name: test-project
properties:
name: test-project
parent:
id:
type: folder
projectId: test-project
type: cloudresourcemanager.v1.project
- metadata:
dependsOn: test-project
name: billing_test-project
properties:
billingAccountName: billingAccountName
name: projects/test-project
type: deploymentmanager.v2.virtual.projectBillingInfo
- name: apis
properties:
apis: compute.googleapis.com
billing: billing_test-project
concurrent_api_activation: True
project: test-project
type: apis.py
- name: service-accounts
properties:
project: test-project
service-accounts:
type: service-accounts.py
- action: gcp-types/compute-v1:compute.projects.setUsageExportBucket
metadata:
dependsOn: test-project,test-project-compute.googleapis.com
name: set-export-bucket
properties:
bucketName: gs://usage-exports
project: test-project
reportNamePrefix: usage_gce_
尝试应用以下递归函数。这应该适用于您的特定用例:
resources = {'resources': [{'name': 'test-project',
'properties': {'name': 'test-project',
'parent': {'id': '', 'type': 'folder'},
'projectId': 'test-project'},
'type': 'cloudresourcemanager.v1.project'},
{'metadata': {'dependsOn': ['test-project']},
'name': 'billing_test-project',
'properties': {'billingAccountName': 'billingAccountName',
'name': 'projects/test-project'},
'type': 'deploymentmanager.v2.virtual.projectBillingInfo'},
{'name': 'apis',
'properties': {'apis': ['compute.googleapis.com'],
'billing': 'billing_test-project',
'concurrent_api_activation': True,
'project': 'test-project'},
'type': 'apis.py'},
{'name': 'service-accounts',
'properties': {'project': 'test-project',
'service-accounts': ''},
'type': 'service-accounts.py'},
{'action': 'gcp-types/compute-v1:compute.projects.setUsageExportBucket',
'metadata': {'dependsOn': ['test-project',
'test-project-compute.googleapis.com']},
'name': 'set-export-bucket',
'properties': {'bucketName': 'gs://usage-exports',
'project': 'test-project',
'reportNamePrefix': 'usage_gce_'}}]}
def unpack_dict(d, spaces=0):
try:
s = ' ' * spaces
spaces += 2
return ' '.join([f'\n{s}{k}: {unpack_dict(v, spaces)}' for k, v in d.items()])
except AttributeError:
if isinstance(d, list):
return ''.join([unpack_dict(item) for item in d])
else:
return d
result = unpack_dict(resources).strip()
print(result)
的输出
resources:
name: test-project
properties:
name: test-project
parent:
id:
type: folder
projectId: test-project
type: cloudresourcemanager.v1.project
metadata:
dependsOn: test-project
name: billing_test-project
properties:
billingAccountName: billingAccountName
name: projects/test-project
type: deploymentmanager.v2.virtual.projectBillingInfo
name: apis
properties:
apis: compute.googleapis.com
billing: billing_test-project
concurrent_api_activation: True
project: test-project
type: apis.py
name: service-accounts
properties:
project: test-project
service-accounts:
type: service-accounts.py
action: gcp-types/compute-v1:compute.projects.setUsageExportBucket
metadata:
dependsOn: test-projecttest-project-compute.googleapis.com
name: set-export-bucket
properties:
bucketName: gs://usage-exports
project: test-project
reportNamePrefix: usage_gce_
请注意:
- 如果由于Python版本(<3.6)而无法使用F-strings,您可以使用
str
[=36]的format()
功能=].
- 如果你需要那些连字符,比如 "name" 前面的连字符(我不太清楚它们应该在输出中的其他地方),你可以创建一个包含在键中的时间字典它们应该在哪里,并应用我提供的
unpack_dict()
函数,传递那个时间字典而不是原来的 resources
.
取下面的字典和键值对列表:
[{'name': 'test-project',
'properties': {'name': 'test-project',
'parent': {'id': '', 'type': 'folder'},
'projectId': 'test-project'},
'type': 'cloudresourcemanager.v1.project'},
{'metadata': {'dependsOn': ['test-project']},
'name': 'billing_test-project',
'properties': {'billingAccountName': 'billingAccountName',
'name': 'projects/test-project'},
'type': 'deploymentmanager.v2.virtual.projectBillingInfo'},
{'name': 'apis',
'properties': {'apis': ['compute.googleapis.com'],
'billing': 'billing_test-project',
'concurrent_api_activation': True,
'project': 'test-project'},
'type': 'apis.py'},
{'name': 'service-accounts',
'properties': {'project': 'test-project',
'service-accounts': ''},
'type': 'service-accounts.py'},
{'action': 'gcp-types/compute-v1:compute.projects.setUsageExportBucket',
'metadata': {'dependsOn': ['test-project',
'test-project-compute.googleapis.com']},
'name': 'set-export-bucket',
'properties': {'bucketName': 'gs://usage-exports',
'project': 'test-project',
'reportNamePrefix': 'usage_gce_'}}]}
我需要将其转换为以下语法:
资源:\n- 名称:test-project\n 属性:\n 名称:test-project\n 父级:\n id:\n 类型:folder\n
我想在我的简短 Google 搜索之后,也许像下面这样的东西会起作用:
'\n'.join(d for d in resources)
不幸的是,这给了我错误: "TypeError: sequence item 0: expected str instance, dict found"
如有任何帮助,我们将不胜感激。
(作为旁注,Google 的配置内容是字符串的唯一示例是用于创建 VM:https://cloud.google.com/deployment-manager/docs/deployments#api;我注意到空格似乎随着每个键的增加而增加值对,但我不完全确定这里是否真的需要)。
编辑: 抱歉,我的意思是说我需要与以下格式类似的键值对,作为字符串:
resource = "resources:\n- name: vm-created-by-cloud-config\n type: compute.v1.instance\n properties:\n zone: us-central1-a\n machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n disks:\n - deviceName: boot\n type: PERSISTENT\n boot: true\n autoDelete: true\n initializeParams:\n diskName: disk-created-by-cloud-config\n sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20151104\n networkInterfaces:\n - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default\n"
因此,打印时,它看起来像这样:
resources:
- name: test-project
properties:
name: test-project
parent:
id:
type: folder
projectId: test-project
type: cloudresourcemanager.v1.project
- metadata:
dependsOn: test-project
name: billing_test-project
properties:
billingAccountName: billingAccountName
name: projects/test-project
type: deploymentmanager.v2.virtual.projectBillingInfo
- name: apis
properties:
apis: compute.googleapis.com
billing: billing_test-project
concurrent_api_activation: True
project: test-project
type: apis.py
- name: service-accounts
properties:
project: test-project
service-accounts:
type: service-accounts.py
- action: gcp-types/compute-v1:compute.projects.setUsageExportBucket
metadata:
dependsOn: test-project,test-project-compute.googleapis.com
name: set-export-bucket
properties:
bucketName: gs://usage-exports
project: test-project
reportNamePrefix: usage_gce_
尝试应用以下递归函数。这应该适用于您的特定用例:
resources = {'resources': [{'name': 'test-project',
'properties': {'name': 'test-project',
'parent': {'id': '', 'type': 'folder'},
'projectId': 'test-project'},
'type': 'cloudresourcemanager.v1.project'},
{'metadata': {'dependsOn': ['test-project']},
'name': 'billing_test-project',
'properties': {'billingAccountName': 'billingAccountName',
'name': 'projects/test-project'},
'type': 'deploymentmanager.v2.virtual.projectBillingInfo'},
{'name': 'apis',
'properties': {'apis': ['compute.googleapis.com'],
'billing': 'billing_test-project',
'concurrent_api_activation': True,
'project': 'test-project'},
'type': 'apis.py'},
{'name': 'service-accounts',
'properties': {'project': 'test-project',
'service-accounts': ''},
'type': 'service-accounts.py'},
{'action': 'gcp-types/compute-v1:compute.projects.setUsageExportBucket',
'metadata': {'dependsOn': ['test-project',
'test-project-compute.googleapis.com']},
'name': 'set-export-bucket',
'properties': {'bucketName': 'gs://usage-exports',
'project': 'test-project',
'reportNamePrefix': 'usage_gce_'}}]}
def unpack_dict(d, spaces=0):
try:
s = ' ' * spaces
spaces += 2
return ' '.join([f'\n{s}{k}: {unpack_dict(v, spaces)}' for k, v in d.items()])
except AttributeError:
if isinstance(d, list):
return ''.join([unpack_dict(item) for item in d])
else:
return d
result = unpack_dict(resources).strip()
print(result)
resources:
name: test-project
properties:
name: test-project
parent:
id:
type: folder
projectId: test-project
type: cloudresourcemanager.v1.project
metadata:
dependsOn: test-project
name: billing_test-project
properties:
billingAccountName: billingAccountName
name: projects/test-project
type: deploymentmanager.v2.virtual.projectBillingInfo
name: apis
properties:
apis: compute.googleapis.com
billing: billing_test-project
concurrent_api_activation: True
project: test-project
type: apis.py
name: service-accounts
properties:
project: test-project
service-accounts:
type: service-accounts.py
action: gcp-types/compute-v1:compute.projects.setUsageExportBucket
metadata:
dependsOn: test-projecttest-project-compute.googleapis.com
name: set-export-bucket
properties:
bucketName: gs://usage-exports
project: test-project
reportNamePrefix: usage_gce_
请注意:
- 如果由于Python版本(<3.6)而无法使用F-strings,您可以使用
str
[=36]的format()
功能=]. - 如果你需要那些连字符,比如 "name" 前面的连字符(我不太清楚它们应该在输出中的其他地方),你可以创建一个包含在键中的时间字典它们应该在哪里,并应用我提供的
unpack_dict()
函数,传递那个时间字典而不是原来的resources
.