附加到YAML文件

时间:2018-10-17 19:58:37

标签: python-3.x yaml pyyaml

我不知道如何使用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)

我该怎么做?

1 个答案:

答案 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()是安全的。