2012-02-03 41 views
8

Ví dụ từ Using YAML with PythonLàm cách nào để tạo tệp yaml từ python tinh khiết?

file YAML gốc chứa này

# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 

Sau khi tải nội dung từ các tập tin sử dụng yaml.load(), và đổ nó vào một file YAML mới, tôi có được điều này thay vì:

# tree format 
treeroot: 
    branch1: 
     branch1-1: {name:Node 1-1} 
     name: Node 1 
    branch2: 
     branch2-1: {name: Node 2-1} 
     name: Node 2 

Cách thích hợp để xây dựng một tệp YAML trực tiếp từ con trăn thuần túy là gì? Tôi không muốn tự viết chuỗi. Tôi muốn xây dựng từ điển và danh sách.


phần ...

dataMap = {'treeroot': 
       {'branch2': 
       {'branch1-1': 
        {'name': 'Node 1-1'}, # should be its own level 
        'name': 'Node 1' 
       } 
       } 
      } 
+1

Bạn có hỏi cách bạn có thể đảm bảo nhận được cùng một tệp như trong không? Nếu vậy, không có sự đảm bảo, bởi vì từ điển không có thứ tự được xác định trước. – Nate

+0

@Nate Right, đó là ý định của tôi. Tôi hiểu điều đó. Tôi đã chỉnh sửa và cung cấp một phần của cấu trúc. Các bãi chứa Yaml không thể parase {name: Node 1-1} bên trong thành một cấp độ khác .... – CppLearner

Trả lời

7

Được rồi. Tôi chỉ cần kiểm tra lại tài liệu. Chúng tôi cần điều này ở phần cuối của yaml.dump(data, optional_args)

Việc sửa chữa này là

yaml.dump(dataMap, f, default_flow_style=False) 

nơi dataMap là nguồn yaml.load() và f là tập tin để được ghi vào.

+0

Vùng đổ này không viết nhận xét '#tree format'. – Anthon

1

Giả sử bạn đang sử dụng PyYAML như bạn có lẽ là, sản lượng bạn hiển thị là không copy-paste của những gì một yaml.dump() tạo ra vì nó bao gồm một bình luận, và PyYAML không viết những cái đó.

Nếu bạn muốn giữ mà nhận xét, cũng như ví dụ thứ tự quan trọng trong các tập tin (tốt đẹp khi bạn lưu trữ các tập tin trong một hệ thống kiểm soát sửa đổi) sử dụng ¹:

import ruamel.yaml as yaml 

yaml_str = """\ 
# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 # should be its own level 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 
""" 

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader) 
print yaml.dump(data, Dumper=yaml.RoundTripDumper, indent=4) 

mà được bạn chính xác đầu vào:

# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 # should be its own level 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 

¹ này được thực hiện sử dụng ruamel.yaml một phiên bản nâng cao của PyYAML trong đó tôi là tác giả.

Các vấn đề liên quan