我不知道如何使用YAML文件,我有一个db.yaml
文件,其中包含此内容
beatport_links:
afro-house: "https://www.beatport.com/genre/afro-house/89/top-100"
big-room: "https://www.beatport.com/genre/big-room/79/top-100"
breaks: "https://www.beatport.com/genre/breaks/9/top-100"
我的程序从该文件中读取流派名称并链接到前100名,然后从网页上抓取歌曲名称并将其添加到字典中
def load_yaml_file(self):
with open(self.yaml_file, "r") as file_content:
self.data = yaml.load(file_content)
def get_genres_and_links(self):
for genre, link in self.data.get("beatport_links").items():
self.beatport_links[genre] = link
现在我有一个包含这样内容的列表
["Adam_Beyer_-_Rome_Future_(Original_Mix)", "Veerus_-_Wheel_(Original_Mix)"]
我希望我的程序使用此列表中的内容(附加到该文件)来更新db.yaml
文件,所以最后我希望db.yaml
看起来像这样:
beatport_links:
afro-house: "https://www.beatport.com/genre/afro-house/89/top-100"
big-room: "https://www.beatport.com/genre/big-room/79/top-100"
breaks: "https://www.beatport.com/genre/breaks/9/top-100"
downloaded:
Adam_Beyer_-_Rome_Future_(Original_Mix)
Veerus_-Wheel(Original_Mix)
我该怎么做?
答案 0 :(得分:0)
您不需要get_genres_and_links
,可以直接更新self.data
通过这样做:
self.data['downloaded'] = some_data
问题在于,在预期的输出中,您具有作为键downloaded
的值,并且具有多行纯标量而不是列表。尽管您可以执行some_data = ' '.join(["Adam_Beyer_-_Rome_Future_(Original_Mix)", "Veerus_-_Wheel_(Original_Mix)"])
来获取字符串值,但是几乎不可能让PyYAML输出纯标量多行和非紧凑型(读取是微不足道的。相反,我将转储到文字块中)样式标量,然后使用"\n".join()
加入列表,然后输出如下:
beatport_links:
afro-house: "https://www.beatport.com/genre/afro-house/89/top-100"
big-room: "https://www.beatport.com/genre/big-room/79/top-100"
breaks: "https://www.beatport.com/genre/breaks/9/top-100"
downloaded: |-
Adam_Beyer_-_Rome_Future_(Original_Mix)
Veerus_-Wheel(Original_Mix)
(您可以在加入列表项之后添加换行符来消除|
之后的破折号)。
如果您的预期输出是可接受的,则如下所示:
beatport_links:
afro-house: "https://www.beatport.com/genre/afro-house/89/top-100"
big-room: "https://www.beatport.com/genre/big-room/79/top-100"
breaks: "https://www.beatport.com/genre/breaks/9/top-100"
downloaded:
- Adam_Beyer_-_Rome_Future_(Original_Mix)
- Veerus_-Wheel(Original_Mix)
然后事情变得更容易且容易做
self.data['downloaded'] = ["Adam_Beyer_-_Rome_Future_(Original_Mix)", "Veerus_-_Wheel_(Original_Mix)"]
with open('some_file', 'w') as fp:
yaml.safe_dump(self.data, fp)
就足够了。
无论如何,如果您进行这种加载,修改,转储,那么您
应该认真看待ruamel.yaml
(免责声明:我是该软件包的作者)。它不仅实现了较新的YAML 1.2,而且在进行这种往返操作时还保留了注释,标签,特殊ID,键顺序。它还内置了对文字样式块标量的支持。除此之外,它的默认.load()
是安全的。