1. YAML คืออะไร?
ภาพรวมของ YAML
YAML (YAML Ain’t Markup Language) เป็นหนึ่งในรูปแบบการทำซีเรียลไลซ์ข้อมูล ที่ถูกใช้อย่างแพร่หลายในการแทนข้อมูลที่มีโครงสร้าง คล้ายกับ JSON และ XML แต่จุดเด่นของ YAML คือความเรียบง่ายและการอ่านที่ง่าย โดยเฉพาะการใช้การเยื้อง (indent) เพื่อแสดงโครงสร้างลำดับขั้น ทำให้มนุษย์สามารถอ่านได้สะดวกขึ้น
ความแตกต่างระหว่าง JSON และ XML
แม้ว่า JSON และ XML จะถูกใช้เพื่อบันทึกข้อมูลเช่นกัน แต่ YAML มีจุดเด่นที่ใช้สัญลักษณ์น้อยกว่าและเข้าใจง่ายกว่า ตัวอย่างเช่น JSON ใช้วงเล็บปีกกา {}
และเครื่องหมายจุลภาค ,
จำนวนมาก ทำให้เมื่อจัดการข้อมูลขนาดใหญ่ การมองเห็นโครงสร้างจะยุ่งยากขึ้น ในขณะที่ YAML ใช้การเยื้องเพื่อบอกโครงสร้าง ทำให้สามารถเข้าใจลำดับขั้นของข้อมูลได้ง่ายขึ้น
ความเข้ากันได้ดีกับ Python
ไวยากรณ์ของ Python มีการใช้การเยื้องเพื่อบอกโครงสร้างบล็อกโค้ด ซึ่งสอดคล้องกับรูปแบบของ YAML นอกจากนี้ยังมีไลบรารีชื่อว่า “PyYAML” สำหรับ Python ที่ช่วยให้อ่านและเขียนไฟล์ YAML ได้อย่างง่ายดาย ทำให้ถูกนำมาใช้บ่อยในฐานะไฟล์การตั้งค่า

2. วิธีอ่านและเขียนไฟล์ YAML ด้วย Python
การอ่านไฟล์ YAML
หากต้องการอ่านไฟล์ YAML ใน Python ขั้นแรกต้องติดตั้งไลบรารี “PyYAML” และใช้ฟังก์ชัน yaml.safe_load()
ฟังก์ชันนี้จะช่วยแปลงข้อมูล YAML เป็น dictionary หรือ list ของ Python ได้อย่างปลอดภัย ตัวอย่างโค้ด:
import yaml
# เปิดไฟล์ YAML และอ่านเนื้อหา
with open('config.yaml', 'r') as file:
data = yaml.safe_load(file)
print(data)
โค้ดนี้จะอ่านข้อมูลจากไฟล์ YAML และแปลงเป็น dictionary ของ Python ตัวอย่างเช่น หากไฟล์ YAML เป็นดังนี้:
database:
host: localhost
port: 3306
Python จะได้ผลลัพธ์เป็น:
{'database': {'host': 'localhost', 'port': 3306}}
การเขียนไฟล์ YAML
เพื่อบันทึกข้อมูล Python ลงในรูปแบบ YAML สามารถใช้ฟังก์ชัน yaml.dump()
ตัวอย่างโค้ด:
import yaml
data = {
'name': 'John Doe',
'age': 30,
'city': 'New York'
}
with open('output.yaml', 'w') as file:
yaml.dump(data, file)
ผลลัพธ์ที่ได้คือไฟล์ YAML ที่มีเนื้อหาดังนี้:
age: 30
city: New York
name: John Doe
การจัดการภาษาไทยหรือภาษาญี่ปุ่น
เมื่อใช้ YAML กับภาษาไทยหรือภาษาญี่ปุ่น ควรกำหนดออปชัน allow_unicode=True
เพื่อป้องกันปัญหาตัวอักษรแสดงผลผิดพลาด:
yaml.dump(data, file, allow_unicode=True)

3. การใช้งาน YAML ขั้นสูง
การสร้างแท็กแบบกำหนดเอง
YAML ไม่เพียงรองรับชนิดข้อมูลพื้นฐาน เช่น list หรือ dictionary แต่ยังสามารถ serialize และ deserialize วัตถุ Python ได้โดยใช้แท็กแบบกำหนดเอง ตัวอย่างเช่น:
import yaml
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def person_representer(dumper, data):
return dumper.represent_mapping('!Person', {'name': data.name, 'age': data.age})
def person_constructor(loader, node):
values = loader.construct_mapping(node)
return Person(values['name'], values['age'])
yaml.add_representer(Person, person_representer)
yaml.add_constructor('!Person', person_constructor)
# แปลงอ็อบเจ็กต์เป็น YAML และบันทึก
person = Person('Alice', 25)
with open('person.yaml', 'w') as file:
yaml.dump(person, file)
# โหลดอ็อบเจ็กต์กลับจาก YAML
with open('person.yaml', 'r') as file:
loaded_person = yaml.load(file, Loader=yaml.FullLoader)
ด้วยวิธีนี้ สามารถบันทึกอ็อบเจ็กต์ Python ในรูปแบบ YAML และนำกลับมาใช้งานใหม่ได้
การคงลำดับข้อมูล
โดยปกติ PyYAML จะไม่รักษาลำดับของ dictionary หากลำดับสำคัญ แนะนำให้ใช้ ruamel.yaml
ซึ่งจะเก็บลำดับคีย์ไว้ครบถ้วน เหมาะกับไฟล์การตั้งค่าที่ต้องการรักษาลำดับ

4. ตัวอย่างการใช้ YAML: การจัดการไฟล์การตั้งค่า
ความสะดวกของ YAML ในการใช้เป็นไฟล์การตั้งค่า
YAML ถูกใช้อย่างกว้างขวางในฐานะไฟล์การตั้งค่า โดยเฉพาะในแอปพลิเคชัน Python เพราะอ่านง่ายและแสดงโครงสร้างแบบลำดับชั้นชัดเจน เหมาะสำหรับการจัดการข้อมูลเช่น การเชื่อมต่อฐานข้อมูล หรือการตั้งค่า log:
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log
ตัวอย่างการใช้ YAML ในโปรเจ็กต์จริง
YAML ถูกใช้งานใน Django, Flask, CircleCI, Kubernetes และอีกมากมาย มักใช้ในการจัดการการตั้งค่าและตัวแปรสภาพแวดล้อม
ตัวอย่างใน Django:
import yaml
with open('config.yaml', 'r') as file:
config = yaml.safe_load(file)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': config['database']['name'],
'USER': config['database']['username'],
'PASSWORD': config['database']['password'],
'HOST': config['database']['host'],
'PORT': config['database']['port'],
}
}
การเปรียบเทียบกับ JSON และ XML
เมื่อเปรียบเทียบกับ JSON และ XML จะเห็นว่า YAML อ่านง่ายกว่า JSON ใช้เครื่องหมายปีกกาและจุลภาคมาก ส่วน XML ใช้แท็กเปิด-ปิดจำนวนมาก ในขณะที่ YAML ใช้การเยื้องแทน:
{
"database": {
"host": "localhost",
"port": 3306,
"username": "user",
"password": "pass"
},
"logging": {
"level": "DEBUG",
"file": "/var/log/app.log"
}
}
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log

5. การแก้ปัญหาและการจัดการข้อผิดพลาด
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
ข้อผิดพลาดทั่วไปในการใช้ไฟล์ YAML ได้แก่ “ไฟล์ไม่พบ” หรือ “ไฟล์ไม่อยู่ในรูปแบบที่ถูกต้อง” ปัญหาเหล่านี้สามารถป้องกันได้ด้วยการเขียนโค้ดจัดการข้อผิดพลาด (error handling) อย่างเหมาะสม ตัวอย่างเช่น:
import yaml
def load_yaml(file_path):
try:
with open(file_path, 'r') as file:
data = yaml.safe_load(file)
except FileNotFoundError:
print(f"Error: The file {file_path} does not exist.")
return None
except yaml.YAMLError as e:
print(f"Error: Failed to parse YAML file. {e}")
return None
return data
config = load_yaml('config.yaml')
if config:
print(config)
แนวทางปฏิบัติที่ดีที่สุดในการจัดการข้อผิดพลาด
- ตรวจสอบการมีอยู่ของไฟล์: ตรวจสอบว่าไฟล์มีอยู่จริงหรือไม่ หากไม่มีให้แจ้งข้อความแสดงข้อผิดพลาด
- จัดการข้อผิดพลาดในการ parse: หาก YAML syntax ไม่ถูกต้อง ให้ดักจับข้อผิดพลาดและแจ้งรายละเอียด
- บันทึก Log: เมื่อเกิดปัญหา ให้บันทึกข้อความผิดพลาดลงใน log เพื่อช่วยในการวิเคราะห์ภายหลัง
6. สรุป
YAML เป็นรูปแบบการจัดเก็บข้อมูลที่มีความเรียบง่ายและอ่านง่าย รองรับการใช้งานร่วมกับ Python ได้ดี การอ่านและเขียนไฟล์ YAML ทำได้ไม่ซับซ้อนและเหมาะสำหรับการจัดการไฟล์การตั้งค่า นอกจากนี้ยังสามารถใช้งานขั้นสูง เช่น custom tags, serialization ของ class, และการรักษาลำดับข้อมูล ซึ่งทำให้การพัฒนาและจัดการการตั้งค่ามีความยืดหยุ่นและทรงพลังมากขึ้น
การใช้ YAML ไม่ได้จำกัดแค่ไฟล์การตั้งค่าเท่านั้น แต่ยังใช้เป็นรูปแบบการเก็บข้อมูลทั่วไปในหลายโปรเจ็กต์ และคาดว่าจะถูกใช้อย่างต่อเนื่องในอนาคต