目次
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 เพื่อช่วยในการวิเคราะห์ภายหลัง