回答:
Cヘッダーに依存しない最も簡単で最も純粋な方法は、PyYaml(ドキュメント)で、次の方法でインストールできますpip install pyyaml
。
#!/usr/bin/env python
import yaml
import json
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
アプリケーションでは、次のことが重要になる場合があります。
構成ファイルを作成する方法を探している場合は、私の短い記事「Pythonでの構成ファイル」を読んでください。
€
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のloadメソッドがまだ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'
例:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
私は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ファイルから任意のコードを実行できないためです。