পাইথনে আমি কীভাবে ওয়াইএএমএল ফাইলকে পার্স করতে পারি?
পাইথনে আমি কীভাবে ওয়াইএএমএল ফাইলকে পার্স করতে পারি?
উত্তর:
সি হেডারের উপর নির্ভর না করে সবচেয়ে সহজ এবং শুদ্ধতম পদ্ধতিটি হল পাইওয়ামল ( ডকুমেন্টেশন ), যা এর মাধ্যমে ইনস্টল করা যেতে পারে 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()
স্বেচ্ছামূলক কোড কার্যকর করার সম্ভাবনাটি এড়াতে যাতে আপনার স্পষ্টতভাবে স্বেচ্ছাসেবী অবজেক্ট সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন সরবরাহ না করা হয় তবে তা সর্বদা পছন্দ করা উচিত।
নোট করুন পাইওয়ামল প্রকল্প ওয়াইএএমএল 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 নির্দিষ্টকরণের সাথে সামঞ্জস্য করে (মুক্তি পেয়েছে ২০০৯) তবে আপনার রুমেল.আইএমএল ব্যবহার করা উচিত (অস্বীকৃতি: আমি সেই প্যাকেজের লেখক)। এটি মূলত পাইওয়ামএল-এর একটি সুপারস্টার, যা বেশিরভাগ YAML 1.1 (2005 থেকে) সমর্থন করে।
রাউন্ড-ট্রিপিংয়ের সময় আপনি যদি নিজের মন্তব্যগুলি সংরক্ষণ করতে সক্ষম হতে চান তবে অবশ্যই আপনার অবশ্যই রুমাল.আইএমএল ব্যবহার করা উচিত।
@ জনের উদাহরণ আপগ্রেড করা সহজ:
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
ফাইলগুলি ম্যানিপুলেট করার জন্য পাথলিব ব্যবহার করেন তবে আপনি নতুন এপিআই রুমেল.আইএমএল সরবরাহ করে ব্যবহার করার চেয়ে ভাল are
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 ব্যবহার করে না তাই কাজ করে নি। এটি কি বাগ?
প্রথমে পাইপ 3 ব্যবহার করে পাইমল ইনস্টল করুন।
তারপরে ইয়ামল মডিউলটি আমদানি করুন এবং ফাইলটিকে 'মাই_ডিক্ট' নামে একটি অভিধানে লোড করুন:
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
আপনার এটাই দরকার। এখন পুরো ইয়ামল ফাইলটি 'মাই_ডিক্ট' অভিধানে রয়েছে।
!!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']
আমি রুমেল.আইএমএল ব্যবহার করি । বিশদ এবং বিতর্ক এখানে ।
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
রুমেল.আইএমএল এর ব্যবহার পিআইএএমএল এর পুরানো ব্যবহারের সাথে সামঞ্জস্যপূর্ণ (কিছু সাধারণ সমাধানযোগ্য সমস্যার সাথে) এবং এটি যেভাবে আমার সরবরাহ করা লিঙ্কে বলা হয়েছে, ব্যবহার
from ruamel import yaml
পরিবর্তে
import yaml
এবং এটি আপনার বেশিরভাগ সমস্যার সমাধান করবে।
সম্পাদনা করুন : পাইমামএলটি মারা যাওয়ার পরে যেমনটি দেখা যাচ্ছে, এটি কেবলমাত্র অন্য কোনও জায়গায় রক্ষণাবেক্ষণ করা হচ্ছে।
#!/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
করতে না চাইলে এটি ব্যবহার করা ভাল কারণ এটি ওয়াইএএমএল ফাইল থেকে স্বেচ্ছাসেবক কোড কার্যকর করতে পারে না।