मैं पायथन में एक YAML फ़ाइल कैसे पार्स कर सकता हूं?
मैं पायथन में एक YAML फ़ाइल कैसे पार्स कर सकता हूं?
जवाबों:
सी हेडर पर भरोसा किए बिना सबसे आसान और शुद्धतम तरीका है PyYaml ( प्रलेखन ), जिसे इसके माध्यम से स्थापित किया जा सकता है 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
आपके आवेदन के लिए, निम्नलिखित महत्वपूर्ण हो सकता है:
यह भी देखें: डेटा क्रमांकन प्रारूपों की तुलना
यदि आप विन्यास फाइल बनाने के लिए रास्ता ढूंढ रहे हैं, तो आप पायथन में मेरी संक्षिप्त लेख विन्यास फाइल पढ़ना चाहते हैं
€
विंडोज पर मेरा आउटपुट है €
। किसी को कारण पता है?
io.open(doc_name, 'r', encoding='utf8')
विशेष वर्ण पढ़ने के लिए मुझे आपकी कोड लाइन बदलनी होगी । YAML संस्करण 0.1.7
open(doc_name, ..., encodung='utf8')
बिना आयात किए, पढ़ने और लिखने के लिए बिल्ट-इन का उपयोग कर सकते हैं io
।
यदि आपके पास YAML है जो YAML 1.2 विनिर्देश (2009 में जारी) के अनुरूप है, तो आपको ruamel.yaml (अस्वीकरण का उपयोग करना चाहिए : मैं उस पैकेज का लेखक हूं)। यह मूल रूप से PyYAML का सुपरसेट है, जो कि YAML 1.1 (2005 से) का अधिकांश समर्थन करता है।
यदि आप राउंड-ट्रिपिंग के दौरान अपनी टिप्पणियों को संरक्षित करने में सक्षम होना चाहते हैं, तो आपको निश्चित रूप से ruamel.yaml का उपयोग करना चाहिए।
उन्नयन @ जॉन का उदाहरण आसान है:
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
फ़ाइलों में हेरफेर करने के लिए पैथलिब का उपयोग कर रहे हैं , तो आप नए API रुमेलम का उपयोग कर रहे हैं।
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)
)। मैं utf-8 के लिए yaml.encoding सेट करने की कोशिश की है, लेकिन 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
ताज़े पायथन 3 पर चलने से परिणाम सामने आते हैं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)
PyamelAM के पुराने उपयोगों के साथ ruamel.yaml का उपयोग (कुछ सरल हल करने योग्य समस्याओं के साथ) संगत है और जैसा कि मैंने लिंक में बताया है, उपयोग
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 फ़ाइल से मनमाना कोड निष्पादित नहीं कर सकता है।