파이썬에서 YAML 파일을 어떻게 구문 분석 할 수 있습니까?
파이썬에서 YAML 파일을 어떻게 구문 분석 할 수 있습니까?
답변:
C 헤더에 의존하지 않는 가장 쉽고 순수한 방법은 PyYaml ( documentation )이며 다음을 통해 설치할 수 있습니다 pip install pyyaml
.
#!/usr/bin/env python
import yaml
with open("example.yaml", 'r') as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
그리고 그게 다야. 일반 yaml.load()
함수도 존재하지만 yaml.safe_load()
임의 코드 실행 가능성을 피하기 위해 제공된 임의의 객체 직렬화 / 직렬화가 명시 적으로 필요하지 않는 한 항상 선호해야합니다.
PyYaml 프로젝트는 YAML 1.1 사양을 통한 버전을 지원합니다 . 경우 YAML 1.2 사양 지원이 필요한 참조 ruamel.yaml 에서 언급 한 바와 같이 이 답변 .
pip install pyyaml
자세한 옵션은이 게시물을 참조하십시오 stackoverflow.com/questions/14261614/…
# -*- coding: utf-8 -*-
import yaml
import io
# Define data
data = {
'a list': [
1,
42,
3.141,
1337,
'help',
u'€'
],
'a string': 'bla',
'another dict': {
'foo': 'bar',
'key': 'value',
'the answer': 42
}
}
# Write YAML file
with io.open('data.yaml', 'w', encoding='utf8') as outfile:
yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True)
# Read YAML file
with open("data.yaml", 'r') as stream:
data_loaded = yaml.safe_load(stream)
print(data == data_loaded)
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
.yml
과 .yaml
응용 프로그램의 경우 다음이 중요 할 수 있습니다.
참조 : 데이터 직렬화 형식 비교
구성 파일을 만드는 방법을 찾고 있다면 짧은 기사 구성 파일을 파이썬 으로 읽으십시오.
€
Windows에서 내 출력은 입니다 €
. 아무도 이유를 알고 있습니까?
io.open(doc_name, 'r', encoding='utf8')
특수 문자를 읽으 려면 코드 줄을 변경해야했습니다 . YAML 버전 0.1.7
open(doc_name, ..., encodung='utf8')
가져 오기없이 내장형 을 읽고 쓸 수 있습니다 io
.
YAML 1.2 사양 (2009 릴리스)을 준수하는 YAML 이있는 경우 ruamel.yaml (면책 조항 : 해당 패키지의 작성자 임)을 사용해야합니다. 본질적으로 PyYAML의 상위 집합으로, 대부분의 YAML 1.1 (2005 년)을 지원합니다.
라운드 트립 할 때 의견을 보존하려면 ruamel.yaml을 사용해야합니다.
@Jon의 예제를 업그레이드하는 것은 쉽습니다.
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
safe_load()
실제로 입력을 완전히 제어하고 필요하지 않은 경우에는 사용 하지 마십시오.
Path
파일 조작에 pathlib 를 사용하는 경우 새로운 API ruamel.yaml이 제공하는 것이 좋습니다.
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 926: ordinal not in range(128)
). yaml.encoding을 utf-8로 설정하려고 시도했지만 YAML의로드 메소드가 여전히 ascii_decode를 사용하므로 작동하지 않았습니다. 이것이 버그입니까?
먼저 pip3을 사용하여 pyyaml을 설치하십시오.
그런 다음 yaml 모듈을 가져 와서 파일을 'my_dict'라는 사전에로드하십시오.
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
그게 당신이 필요한 전부입니다. 이제 전체 yaml 파일이 'my_dict'사전에 있습니다.
!!python
) 특정 태그가 포함되어 있으면 사용하기에 안전하지 않을 수 있습니다 (하드 디스크를 완전히 청소 한 것처럼) yaml.load()
. 명확하게 문서화되었으므로 여기서 경고를 반복해야합니다 (거의 모든 경우에 yaml.safe_load()
사용할 수 있음).
import yaml
하지만 내장 모듈이 아니며 어떤 패키지인지 지정하지 않습니다. import yaml
새로운 Python3 설치로 실행 하면ModuleNotFoundError: No module named 'yaml'
ruamel.yaml을 사용 합니다 . 자세한 내용 및 토론은 여기를 참조하십시오 .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
ruamel.yaml의 사용법은 PyYAML의 오래된 사용법과 호환되며 (일부 간단한 해결 가능한 문제와 함께) 제공된 링크에 명시된 바와 같이 사용하십시오
from ruamel import yaml
대신에
import yaml
대부분의 문제를 해결합니다.
편집 : PyYAML은 다른 장소에서 유지 관리되는 것으로 나타났습니다.
#!/usr/bin/env python
import sys
import yaml
def main(argv):
with open(argv[0]) as stream:
try:
#print(yaml.load(stream))
return 0
except yaml.YAMLError as exc:
print(exc)
return 1
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
yaml.safe_load
YAML 파일에서 임의의 코드를 실행할 수 없으므로 사용하는 것이 좋습니다 .