将 Python 与 YAML 一起使用
Using Python with YAML
我有一个 YAML 文件,我想在我的游戏中存储不同的 "players"。
YAML 文件如下所示:
Person:
Name:
Age:
Nationality:
Footed:
Position:
创建播放器后,YAML 文件应如下所示:
Person:
Name: Rich
Age: 23
Nationality: British
Footed: Right
Position: Forward
到目前为止我的代码是这样的:
import yaml
name = input('What is your name? ')
age = int(input('What is your age? '))
nationality = input('What is your nationality? ')
footed = input('What foot? ')
position = input('What is your position? ')
with open('test.yml', 'a') as outfile:
outfile.write(yaml.dump({'Name' : name, 'Age' : age, 'Nationality' : nationality,
'Footed' : footed, 'Position' : position}))
但是当我 运行 这个并给用户输入时,yaml 文件最终看起来像:
{Age: 2, Footed: r, Name: r, Nationality: r, Position: r}
如何将它添加到 YAML 文件而不是附加到 YAML 文件,以及如何垂直而不是水平构建它?最后,如果我想添加 10/20/n 个播放器,我希望 YAML 文件将它们全部存储在彼此下面,以便我可以单独调用每个播放器
- 使用
"w"
打开文件,而不是 "a"
。
- 你还必须写一个
Person
。
- 使用选项
default_flow_style=False
。
代码:
with open('test.yml', 'w') as outfile:
outfile.write(yaml.dump(
{"Person": {
'Name' : name,
'Age' : age,
'Nationality' : nationality,
'Footed' : footed,
'Position' : position}
},
default_flow_style=False))
输出
Person:
Name: Rich
Age: 23
Nationality: British
Footed: Right
Position: Forward
你可以这样做:
import pyaml as yaml
name = input('What is your name? ')
age = int(input('What is your age? '))
nationality = input('What is your nationality? ')
footed = input('What foot? ')
position = input('What is your position? ')
person = {'Person':{
'Name': name,
'Age': age,
'Nationality': nationality,
'Footed': footed,
'Position': position}
}
with open('test.yml', 'a') as outfile:
yaml.dump(person, outfile, indent=4)
当你写出你的YAML时,你首先将数据结构写入内存中的文件,然后将内存文件内容作为字符串检索,然后将其写入文件。那是低效和缓慢的。
您还应该只读入您拥有的 YAML 文件,更新数据结构并将其转储:
import yaml
file_name = 'test.yml'
with open(file_name) as infile:
data = yaml.load(infile)
person = data['Person']
person['name'] = input('What is your name? ')
person['age'] = int(input('What is your age? '))
person['nationality'] = input('What is your nationality? ')
person['footed'] = input('What foot? ')
person['position'] = input('What is your position? ')
with open(file_name, 'w') as outfile:
yaml.dump(data, stream=outfile, default_flow_style=False, indent=3)
default_flow_style
参数确保您的键值对在彼此下方列出。
使用 PyYAML,infile 中的任何注释都将丢失,并且映射中键的顺序可能会被打乱。如果这是一个问题,我建议您使用 ruamel.yaml 包(免责声明:我是该包的作者),并将代码更改为:
import ruamel.yaml
file_name = 'test.yml'
with open(file_name) as infile:
data = ruamel.yaml.round_trip_load(infile)
person = data['Person']
person['name'] = input('What is your name? ')
person['age'] = int(input('What is your age? '))
person['nationality'] = input('What is your nationality? ')
person['footed'] = input('What foot? ')
person['position'] = input('What is your position? ')
with open(file_name, 'w') as outfile:
yaml.round_trip_dump(data, stream=outfile, indent=3)
如果要存储多个播放器。确保您的顶层数据结构是一个序列,或者是从某个唯一值(例如人名)映射而来的。在这种情况下,使用不同的输入文件作为模板,并通过读入更新输出文件,附加到列表 cq。更新字典并写出文件。只要名称是唯一的,使用顶层 mapping/dict.
就更容易做到这一点
我有一个 YAML 文件,我想在我的游戏中存储不同的 "players"。
YAML 文件如下所示:
Person:
Name:
Age:
Nationality:
Footed:
Position:
创建播放器后,YAML 文件应如下所示:
Person:
Name: Rich
Age: 23
Nationality: British
Footed: Right
Position: Forward
到目前为止我的代码是这样的:
import yaml
name = input('What is your name? ')
age = int(input('What is your age? '))
nationality = input('What is your nationality? ')
footed = input('What foot? ')
position = input('What is your position? ')
with open('test.yml', 'a') as outfile:
outfile.write(yaml.dump({'Name' : name, 'Age' : age, 'Nationality' : nationality,
'Footed' : footed, 'Position' : position}))
但是当我 运行 这个并给用户输入时,yaml 文件最终看起来像:
{Age: 2, Footed: r, Name: r, Nationality: r, Position: r}
如何将它添加到 YAML 文件而不是附加到 YAML 文件,以及如何垂直而不是水平构建它?最后,如果我想添加 10/20/n 个播放器,我希望 YAML 文件将它们全部存储在彼此下面,以便我可以单独调用每个播放器
- 使用
"w"
打开文件,而不是"a"
。 - 你还必须写一个
Person
。 - 使用选项
default_flow_style=False
。
代码:
with open('test.yml', 'w') as outfile:
outfile.write(yaml.dump(
{"Person": {
'Name' : name,
'Age' : age,
'Nationality' : nationality,
'Footed' : footed,
'Position' : position}
},
default_flow_style=False))
输出
Person:
Name: Rich
Age: 23
Nationality: British
Footed: Right
Position: Forward
你可以这样做:
import pyaml as yaml
name = input('What is your name? ')
age = int(input('What is your age? '))
nationality = input('What is your nationality? ')
footed = input('What foot? ')
position = input('What is your position? ')
person = {'Person':{
'Name': name,
'Age': age,
'Nationality': nationality,
'Footed': footed,
'Position': position}
}
with open('test.yml', 'a') as outfile:
yaml.dump(person, outfile, indent=4)
当你写出你的YAML时,你首先将数据结构写入内存中的文件,然后将内存文件内容作为字符串检索,然后将其写入文件。那是低效和缓慢的。
您还应该只读入您拥有的 YAML 文件,更新数据结构并将其转储:
import yaml
file_name = 'test.yml'
with open(file_name) as infile:
data = yaml.load(infile)
person = data['Person']
person['name'] = input('What is your name? ')
person['age'] = int(input('What is your age? '))
person['nationality'] = input('What is your nationality? ')
person['footed'] = input('What foot? ')
person['position'] = input('What is your position? ')
with open(file_name, 'w') as outfile:
yaml.dump(data, stream=outfile, default_flow_style=False, indent=3)
default_flow_style
参数确保您的键值对在彼此下方列出。
使用 PyYAML,infile 中的任何注释都将丢失,并且映射中键的顺序可能会被打乱。如果这是一个问题,我建议您使用 ruamel.yaml 包(免责声明:我是该包的作者),并将代码更改为:
import ruamel.yaml
file_name = 'test.yml'
with open(file_name) as infile:
data = ruamel.yaml.round_trip_load(infile)
person = data['Person']
person['name'] = input('What is your name? ')
person['age'] = int(input('What is your age? '))
person['nationality'] = input('What is your nationality? ')
person['footed'] = input('What foot? ')
person['position'] = input('What is your position? ')
with open(file_name, 'w') as outfile:
yaml.round_trip_dump(data, stream=outfile, indent=3)
如果要存储多个播放器。确保您的顶层数据结构是一个序列,或者是从某个唯一值(例如人名)映射而来的。在这种情况下,使用不同的输入文件作为模板,并通过读入更新输出文件,附加到列表 cq。更新字典并写出文件。只要名称是唯一的,使用顶层 mapping/dict.
就更容易做到这一点