পাইথনে আমি কীভাবে ওয়াইএএমএল ফাইল পার্স করতে পারি


উত্তর:


803

সি হেডারের উপর নির্ভর না করে সবচেয়ে সহজ এবং শুদ্ধতম পদ্ধতিটি হল পাইওয়ামল ( ডকুমেন্টেশন ), যা এর মাধ্যমে ইনস্টল করা যেতে পারে 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 যেমন উল্লেখ করা এই উত্তর


96
আমি যুক্ত করব যে আপনি স্বেচ্ছাসেবী অবজেক্টগুলিকে সিরিয়ালাইজ / ডিসাইরিয়ালাইজ yaml.safe_loadকরতে না চাইলে এটি ব্যবহার করা ভাল কারণ এটি ওয়াইএএমএল ফাইল থেকে স্বেচ্ছাসেবক কোড কার্যকর করতে পারে না।
ternaryOperator

4
ইয়ামল ইয়ামল = নতুন ইয়ামল (); অবজেক্ট অবজেক্ট = ইয়ামল.লোড ("a: 1 \ nb: 2 \ nc: \ n - aaa \ n - bbb");
মেথিশওয়ার্টজবিউইথথ


4
আপনিই প্রথম PyYAML প্যাকেজটি ইনস্টল করতে হতে পারে pip install pyyaml, জন্য আরও বিকল্প এই পোস্টটিকে দেখতে পারবেন stackoverflow.com/questions/14261614/...
রোমাঁ

7
এই উদাহরণে ব্যতিক্রম ক্যাপচার কী লাভ? এটি যেভাবেই হোক মুদ্রণ করতে চলেছে, এবং এটি উদাহরণটিকে আরও
বিশৃঙ্খল করে তুলেছে

115

পাইথন 2 + 3 (এবং ইউনিকোড) সহ YAML ফাইলগুলি পড়ুন এবং লিখুন

# -*- 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)

YAML ফাইল তৈরি করেছেন Cre

a list:
- 1
- 42
- 3.141
- 1337
- help
- 
a string: bla
another dict:
  foo: bar
  key: value
  the answer: 42

সাধারণ ফাইল সমাপ্তি

.yml এবং .yaml

বিকল্প

আপনার প্রয়োগের জন্য, নিম্নলিখিতগুলি গুরুত্বপূর্ণ হতে পারে:

  • অন্যান্য প্রোগ্রামিং ভাষা দ্বারা সমর্থন
  • পড়া / লেখার পারফরম্যান্স
  • সংক্ষিপ্ততা (ফাইলের আকার)

আরও দেখুন: ডেটা সিরিয়ালাইজেশন ফর্ম্যাটগুলির তুলনা

আপনি যদি কনফিগারেশন ফাইলগুলি তৈরির পরিবর্তে কোনও উপায় সন্ধান করছেন, আপনি পাইথনে আমার সংক্ষিপ্ত নিবন্ধ কনফিগারেশন ফাইলগুলি পড়তে চাইতে পারেন


উইন্ডোজ আমার আউটপুট হয় €। কারও কারন জানা আছে?
ক্লাউড চ

ফাইলটিতে কী এনকোডিং রয়েছে? আপনি কি নিশ্চিত যে এটি utf-8 এনকোডযুক্ত?
মার্টিন থোমা

1
পরামর্শের জন্য ধন্যবাদ। আমার ফাইলটিতে utf-8 এনকোডিং রয়েছে। io.open(doc_name, 'r', encoding='utf8')বিশেষ চরিত্রটি পড়তে আমাকে আপনার কোড লাইনটি পরিবর্তন করতে হয়েছিল। YAML সংস্করণ 0.1.7
ক্লাউড চ

হুঁ, আকর্ষণীয়। আমি আগামীকাল সেই পুনরুত্পাদন করার চেষ্টা করব এবং আমি পারলে প্রশ্নটি সামঞ্জস্য করব। ধন্যবাদ!
মার্টিন থোমা

1
আপনি open(doc_name, ..., encodung='utf8')আমদানি না করে পড়তে এবং লেখার জন্য অন্তর্নির্মিতটি ব্যবহার করতে পারেন io
ডেক্সটারিটাস

61

আপনার যদি 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 ব্যবহার করে না তাই কাজ করে নি। এটি কি বাগ?
স্নুইবিআর

27

প্রথমে পাইপ 3 ব্যবহার করে পাইমল ইনস্টল করুন।

তারপরে ইয়ামল মডিউলটি আমদানি করুন এবং ফাইলটিকে 'মাই_ডিক্ট' নামে একটি অভিধানে লোড করুন:

import yaml
with open('filename.yaml') as f:
    my_dict = yaml.safe_load(f)

আপনার এটাই দরকার। এখন পুরো ইয়ামল ফাইলটি 'মাই_ডিক্ট' অভিধানে রয়েছে।


6
এটি কি ফাইল হ্যান্ডেলটি বন্ধ করে দেয়?
ইয়াংমিলস্টিওরি

2
যদি আপনার ফাইলে "- হ্যালো ওয়ার্ল্ড" লাইন থাকে তবে এটি ভেরিয়েবলটি আমার_ডিক্ট কল করা অনুচিত, কারণ এতে একটি তালিকা থাকবে। যদি সেই ফাইলটিতে নির্দিষ্ট ট্যাগ থাকে (শুরু করে !!python) এটি ব্যবহার করাও অনিরাপদ হতে পারে (সম্পূর্ণ হার্ডডিস্ক মোছা পরিষ্কার হিসাবে) yaml.load()। যেহেতু এটি স্পষ্টভাবে নথিভুক্ত রয়েছে আপনার এখানে সেই সতর্কবার্তাটি পুনরাবৃত্তি করা উচিত (প্রায় সব ক্ষেত্রেই yaml.safe_load()ব্যবহার করা যেতে পারে)।
অ্যান্থন

4
আপনি ব্যবহার করেন import yamlতবে এটি কোনও অন্তর্নির্মিত মডিউল নয় এবং আপনি এটি কোন প্যাকেজটি নির্দিষ্ট করেন না। চলমান import yamlএকটি তাজা Python3 সালে ফলাফল ইনস্টলModuleNotFoundError: No module named 'yaml'
cowlinator


3

আমি রুমেল.আইএমএল ব্যবহার করিবিশদ এবং বিতর্ক এখানে

from ruamel import yaml

with open(filename, 'r') as fp:
    read_data = yaml.load(fp)

রুমেল.আইএমএল এর ব্যবহার পিআইএএমএল এর পুরানো ব্যবহারের সাথে সামঞ্জস্যপূর্ণ (কিছু সাধারণ সমাধানযোগ্য সমস্যার সাথে) এবং এটি যেভাবে আমার সরবরাহ করা লিঙ্কে বলা হয়েছে, ব্যবহার

from ruamel import yaml

পরিবর্তে

import yaml

এবং এটি আপনার বেশিরভাগ সমস্যার সমাধান করবে।

সম্পাদনা করুন : পাইমামএলটি মারা যাওয়ার পরে যেমনটি দেখা যাচ্ছে, এটি কেবলমাত্র অন্য কোনও জায়গায় রক্ষণাবেক্ষণ করা হচ্ছে।


@ অলেকসান্ডার: পাইয়ামল গত 7 মাসে কমিট করেছে, এবং সবচেয়ে সাম্প্রতিক বন্ধ ইস্যুটি 12 দিন আগে ছিল। আপনি কি "দীর্ঘ মৃত" সংজ্ঞা দিতে পারেন?
বিস্ময়কর

@abalter আমি ক্ষমাপ্রার্থী, মনে হচ্ছে যে আমি তাদের অফিসিয়াল সাইট থেকে তথ্য বা পোস্ট অধিকার এখানে পেয়েছিলাম stackoverflow.com/a/36760452/5510526
Oleksandr Zelentsov

@ ওলেকসান্ডারজেলেন্টসভ আমি বিভ্রান্তি দেখতে পাচ্ছি। এটি মারা যাওয়ার সময় একটি দীর্ঘ সময় ছিল। github.com/yaml/pyyaml/ographics/contributors । তবে, তাদের সাইটটি প্রকাশিত হয়েছে এবং পাই ওয়াইমেলের মৃত্যুর কথা উল্লেখ করে এসও পোস্টের পরে প্রকাশিত প্রকাশগুলি দেখায়। সুতরাং এটি বলা ঠিক যে এই মুহুর্তে এটি এখনও জীবিত, যদিও এটি রুমেলের সাথে সম্পর্কিত দিকটি স্পষ্টভাবে অনিশ্চিত। এছাড়াও, সাম্প্রতিক পোস্টগুলির সাথে এখানে দীর্ঘ আলোচনা হয়েছিল। আমি একটি মন্তব্য যুক্ত করেছি, এবং এখন আমার একমাত্র। আমার ধারণা, বন্ধ সমস্যাগুলি কীভাবে কাজ করে তা আমি বুঝতে পারি না। github.com/yaml/pyyaml/issues/145
আবাল্টার

@ বা্যাল্টার এফডাব্লুআইডাব্লু, যখন উত্তরটি পোস্ট করা হয়েছিল, অতীতে মোট 9 টি কমিট হয়েছিল ... মাত্র 7 বছরের নিচে। এর মধ্যে একটি হ'ল খারাপ ব্যাকরণের একটি স্বয়ংক্রিয় "ফিক্স"। দু'জন সবেমাত্র পরিবর্তিত নতুন সংস্করণ প্রকাশের সাথে জড়িত। বাকীগুলি তুলনামূলকভাবে ক্ষুদ্রতর টুইট ছিল, বেশিরভাগ উত্তরের পাঁচ বছর আগে। অটোমেটেড ফিক্স বাদে সবগুলিই একজন ব্যক্তি দ্বারা সম্পন্ন হয়েছিল। পাইওয়ামএলকে "দীর্ঘ মৃত" বলার জন্য আমি এই উত্তরটির কঠোরতার সাথে বিচার করব না।
ফান্ড মনিকার লসুইট

-1
#!/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:]))

1
এই কোডটি আসলে কিছুই করে না। আপনি কোড মন্তব্য করার অর্থ কি?
কাপলিনেটর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.