Hướng dẫn python yaml preserve quotes - dấu ngoặc kép của python yaml

Tôi có tệp yaml sau:

---
my_vars:
  my_env: "dev"
  my_count: 3

Khi tôi đọc nó với pyyaml ​​và đổ lại, tôi nhận được đầu ra sau:

---
my_vars:
  my_env: dev
  my_count: 3

Mã trong câu hỏi:

with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True))

Tôi đã thử sử dụng tham số

---
my_vars:
  my_env: dev
  my_count: 3
1:

with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True, default_style='"'))

Nhưng bây giờ tôi nhận được:

---
"my_vars":
  "my_env": "dev"
  "my_count": !!int "3"

Tôi cần làm gì để giữ định dạng ban đầu, mà không đưa ra bất kỳ giả định nào về các tên biến trong tệp YAML?without making any assumptions about the variable names in the YAML file?

Hướng dẫn python yaml preserve quotes - dấu ngoặc kép của python yaml

DREFTYMAC

30.4K26 Huy hiệu vàng116 Huy hiệu bạc179 Huy hiệu đồng26 gold badges116 silver badges179 bronze badges

hỏi ngày 14 tháng 7 năm 2016 lúc 8:59Jul 14, 2016 at 8:59

Jeroen Jacobsjeroen JacobsJeroen Jacobs

1.3432 Huy hiệu vàng13 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges13 silver badges30 bronze badges

2

Tôi khuyên bạn nên cập nhật để sử dụng YAML 1.2 (phát hành năm 2009) với gói

---
my_vars:
  my_env: dev
  my_count: 3
2 tương thích ngược thay vì sử dụng pyyaml, trong đó thực hiện hầu hết YAML 1.1 (2005). (Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của gói đó).

Sau đó, bạn chỉ cần chỉ định

---
my_vars:
  my_env: dev
  my_count: 3
3 khi tải để vấp ngã trong tệp yaml:

import sys
import ruamel.yaml

yaml_str = """\
---
my_vars:
  my_env: "dev"    # keep "dev" quoted
  my_count: 3
"""

data = ruamel.yaml.round_trip_load(yaml_str, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout, explicit_start=True)

đầu ra nào (bao gồm cả nhận xét được bảo tồn):

---
my_vars:
  my_env: "dev"    # keep "dev" quoted
  my_count: 3

Sau khi tải vô hướng chuỗi sẽ là một lớp con của chuỗi, để có thể chứa thông tin trích dẫn, nhưng sẽ hoạt động như một chuỗi bình thường cho tất cả các mục đích khác. Nếu bạn muốn thay thế một chuỗi như vậy mặc dù (

---
my_vars:
  my_env: dev
  my_count: 3
4 thành
---
my_vars:
  my_env: dev
  my_count: 3
5), bạn phải chuyển chuỗi vào lớp con này (
---
my_vars:
  my_env: dev
  my_count: 3
6 từ
---
my_vars:
  my_env: dev
  my_count: 3
7).

Khi Tripping vòng

---
my_vars:
  my_env: dev
  my_count: 3
2 theo mặc định bảo tồn thứ tự (bằng cách chèn) của các phím.

Đã trả lời ngày 26 tháng 7 năm 2016 lúc 6:28Jul 26, 2016 at 6:28

Phải, vì vậy mượn rất nhiều từ câu trả lời này, bạn có thể làm điều gì đó như thế này:

import yaml

# define a custom representer for strings
def quoted_presenter(dumper, data):
    return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"')

yaml.add_representer(str, quoted_presenter)


env_file = 'input.txt'
with open(env_file) as f:
    env_dict = yaml.load(f)
    print yaml.dump(env_dict, default_flow_style=False)

Tuy nhiên, điều này chỉ quá tải nó trên tất cả các loại chuỗi trong từ điển, vì vậy nó cũng sẽ trích dẫn các khóa, không chỉ các giá trị.

Nó in:

"my_vars":
  "my_count": 3
  "my_env": "dev"

Đây có phải là những gì bạn muốn? Không chắc bạn có nghĩa là gì bởi các tên biến, bạn có nghĩa là các phím?

Đã trả lời ngày 14 tháng 7 năm 2016 lúc 9:29Jul 14, 2016 at 9:29

Hướng dẫn python yaml preserve quotes - dấu ngoặc kép của python yaml

NobilisnobilisNobilis

7.0501 Huy hiệu vàng33 Huy hiệu bạc65 Huy hiệu Đồng1 gold badge33 silver badges65 bronze badges

2

Bạn có thể sử dụng phương thức sau để giữ lại đối tượng

---
my_vars:
  my_env: dev
  my_count: 3
9 của mình trong
with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True))
0:

Lấy ví dụ yaml của bạn:

---
my_vars:
  my_env: "dev"
  my_count: 3

Đang tải nó vào env_dict (từ điển):

---
my_vars:
  my_env: dev
  my_count: 3
0

Các liên kết này đã giúp tôi đi đến câu trả lời này: bất kỳ thư viện YAML nào trong Python hỗ trợ việc đổ các chuỗi dài như các khối nghĩa đen hoặc các khối gấp?

Làm thế nào tôi có thể kiểm soát những gì vô hướng hình thức pyyaml ​​sử dụng cho dữ liệu của tôi?

Ngoài ra, đây là một bài viết tuyệt vời để đọc để trích dẫn hay không trích dẫn?

Hi vọng điêu nay co ich!

Đã trả lời ngày 10 tháng 6 năm 2021 lúc 8:13Jun 10, 2021 at 8:13

Hướng dẫn python yaml preserve quotes - dấu ngoặc kép của python yaml

aspiring1aspiring1aspiring1

3161 Huy hiệu vàng12 Huy hiệu bạc31 Huy hiệu đồng1 gold badge12 silver badges31 bronze badges