{"id":323,"date":"2026-07-08T15:15:45","date_gmt":"2026-07-08T07:15:45","guid":{"rendered":"https:\/\/numsimlab.com\/?p=323"},"modified":"2026-07-08T15:15:45","modified_gmt":"2026-07-08T07:15:45","slug":"python-yaml-%e9%9b%b6%e5%9f%ba%e7%a1%80%e5%ae%8c%e6%95%b4%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=323","title":{"rendered":"Python YAML \u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Python YAML \u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b \u00b7 Python YAML Guide<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}\n.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody td:first-child{text-align:left;font-weight:600}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule)}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.bad h4{color:var(--accent3)}\n.compare-col.good h4{color:var(--accent2)}\npre.example{background:var(--code-bg);padding:.6rem .8rem;border-radius:6px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.78rem;line-height:1.5;margin:.4rem 0;border:1px solid var(--rule);color:var(--ink)}\nfooter{max-width:var(--max-w);margin:3rem auto 0;padding:2rem 1.5rem 3rem;border-top:1px solid var(--rule);text-align:center;font-size:.82rem;color:var(--muted)}\nfooter .links{display:flex;justify-content:center;gap:1.5rem;flex-wrap:wrap;margin-bottom:.8rem}\nfooter .links a{color:var(--muted)}footer .links a:hover{color:var(--accent)}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:22px;font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>\ud83d\udcc4<\/span> Python YAML Guide<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n\n<main>\n<!-- \u4e2d\u6587\u533a\u57df -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Python YAML \u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b<\/h1>\n  <p>\u4ec0\u4e48\u662fYAML\u3001\u5b89\u88c5\u4f9d\u8d56\u3001\u57fa\u7840\u8bed\u6cd5\u3001\u8bfb\u5199\u6587\u4ef6\u3001\u9879\u76ee\u5b9e\u6218\u3001\u5e38\u89c1\u8e29\u5751<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-what\">\u4e00\u3001\u4ec0\u4e48\u662f YAML<\/a><\/li>\n    <li><a href=\"#zh-scene\">\u4e8c\u3001YAML \u9002\u7528\u573a\u666f<\/a><\/li>\n    <li><a href=\"#zh-install\">\u4e09\u3001Python \u5b89\u88c5 pyyaml<\/a><\/li>\n    <li><a href=\"#zh-syntax\">\u56db\u3001YAML \u57fa\u7840\u8bed\u6cd5\uff08\u96f6\u57fa\u7840\u5fc5\u770b\uff09<\/a><\/li>\n    <li><a href=\"#zh-read\">\u4e94\u3001Python \u8bfb\u53d6 YAML \u6587\u4ef6<\/a><\/li>\n    <li><a href=\"#zh-write\">\u516d\u3001Python \u5199\u5165\/\u4fee\u6539 YAML \u6587\u4ef6<\/a><\/li>\n    <li><a href=\"#zh-safe\">\u4e03\u3001\u5b89\u5168\u52a0\u8f7d safe_load \u4f5c\u7528<\/a><\/li>\n    <li><a href=\"#zh-case\">\u516b\u3001\u5b8c\u6574\u5b9e\u6218\u6848\u4f8b\uff1a\u9879\u76ee\u914d\u7f6e\u6587\u4ef6<\/a><\/li>\n    <li><a href=\"#zh-error\">\u4e5d\u3001\u9ad8\u9891\u62a5\u9519\u4e0e\u89e3\u51b3\u529e\u6cd5<\/a><\/li>\n    <li><a href=\"#zh-summary\">\u5341\u3001\u6838\u5fc3\u603b\u7ed3\u901f\u67e5\u8868<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<h2 id=\"zh-what\">\u4e00\u3001\u4ec0\u4e48\u662f YAML<\/h2>\n<p>YAML \u5168\u79f0 <strong>YAML Ain&#8217;t Markup Language<\/strong>\uff0c\u76f4\u8bd1\uff1a\u4e0d\u662f\u6807\u8bb0\u8bed\u8a00\uff0c\u662f\u4e00\u79cd<strong>\u4eba\u7c7b\u6781\u6613\u9605\u8bfb<\/strong>\u7684\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\uff0c\u540e\u7f00\u4e00\u822c\u4e3a <code>.yaml<\/code> \/ <code>.yml<\/code>\u3002<\/p>\n<div class=\"info-box\">\n  <strong>\u4e00\u53e5\u8bdd\u533a\u5206\uff1a<\/strong>JSON \u9760\u5927\u62ec\u53f7\/\u9017\u53f7\uff0cYAML \u9760\u7f29\u8fdb\u548c\u5192\u53f7\uff0c\u4e0d\u7528\u5199\u5f15\u53f7\u3001\u9017\u53f7\uff0c\u53ef\u8bfb\u6027\u66f4\u5f3a\u3002\n<\/div>\n<div class=\"card\">\n  <h4>YAML \u6838\u5fc3\u7279\u70b9<\/h4>\n  <p><span class=\"tag tag-g\">\u6781\u7b80\u65e0\u5197\u4f59<\/span> \u4e0d\u9700\u8981\u5927\u62ec\u53f7\u3001\u9017\u53f7\u3001\u5f15\u53f7<\/p>\n  <p><span class=\"tag tag-b\">\u5c42\u7ea7\u6e05\u6670<\/span> \u4f7f\u7528\u7a7a\u683c\u7f29\u8fdb\u533a\u5206\u7236\u5b50\u5c42\u7ea7\uff08\u4e0d\u80fd\u7528Tab\uff09<\/p>\n  <p><span class=\"tag tag-y\">\u591a\u8bed\u8a00\u901a\u7528<\/span> Python\/Java\/Go\/\u524d\u7aef\/\u5bb9\u5668\u90fd\u652f\u6301<\/p>\n  <p><span class=\"tag tag-p\">\u4e3b\u6d41\u914d\u7f6e\u6807\u51c6<\/span> Docker\u3001K8s\u3001FastAPI\u3001\u722c\u866b\u3001AI\u9879\u76ee\u5168\u90e8\u5728\u7528<\/p>\n<\/div>\n\n<h2 id=\"zh-scene\">\u4e8c\u3001YAML \u9002\u7528\u573a\u666f<\/h2>\n<ul style=\"margin-left:1.2rem;margin-bottom:1rem;\">\n  <li>\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6\uff08\u6570\u636e\u5e93\u5730\u5740\u3001\u7aef\u53e3\u3001\u8d26\u53f7\u5bc6\u7801\u3001\u5f00\u5173\uff09<\/li>\n  <li>\u5bb9\u5668\u7f16\u6392\uff1aKubernetes \u8d44\u6e90\u5b9a\u4e49<\/li>\n  <li>CI\/CD\u6d41\u6c34\u7ebf\uff1aGitHub Actions\u3001GitLab CI<\/li>\n  <li>\u722c\u866b\u3001AI\u8bad\u7ec3\u3001FastAPI\u540e\u7aef\u9879\u76ee\u53c2\u6570\u7ba1\u7406<\/li>\n  <li>\u9759\u6001\u7f51\u7ad9\u3001\u6587\u6863\u9879\u76ee\u53c2\u6570\u914d\u7f6e<\/li>\n<\/ul>\n\n<div class=\"compare-box\">\n  <div class=\"compare-col bad\">\n    <h4>JSON\uff08\u7e41\u7410\uff09<\/h4>\n<pre class=\"example\">{\n  \"server\": {\n    \"host\": \"127.0.0.1\",\n    \"port\": 8000\n  }\n}\n<\/pre>\n  <\/div>\n  <div class=\"compare-col good\">\n    <h4>YAML\uff08\u7b80\u6d01\uff09<\/h4>\n<pre class=\"example\">server:\n  host: 127.0.0.1\n  port: 8000\n<\/pre>\n  <\/div>\n<\/div>\n\n<h2 id=\"zh-install\">\u4e09\u3001Python \u5b89\u88c5 pyyaml<\/h2>\nPython \u539f\u751f\u4e0d\u81ea\u5e26YAML\u89e3\u6790\u5e93\uff0c\u9700\u8981\u5b89\u88c5\u7b2c\u4e09\u65b9\u5305 <code>pyyaml<\/code>\u3002\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>pip \u6807\u51c6\u5b89\u88c5<\/h4>\n    <div class=\"cmd\">pip install pyyaml<\/div>\n    <div class=\"desc\">Windows \/ Mac \/ Linux \u901a\u7528<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>uv \u5b89\u88c5\uff08\u63a8\u8350\uff09<\/h4>\n    <div class=\"cmd\">uv add &#8211;dev pyyaml<\/div>\n    <div class=\"desc\">\u73b0\u4ee3Python\u5305\u7ba1\u7406\u5668\uff0c\u901f\u5ea6\u66f4\u5feb<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>\u9a8c\u8bc1\u662f\u5426\u5b89\u88c5\u6210\u529f<\/h4>\n    <div class=\"cmd\">python -c &#8220;import yaml;print(yaml.__version__)&#8221;<\/div>\n    <div class=\"desc\">\u8f93\u51fa\u7248\u672c\u53f7\u5373\u5b89\u88c5\u5b8c\u6210<\/div>\n  <\/div>\n<\/div>\n\n<h2 id=\"zh-syntax\">\u56db\u3001YAML \u57fa\u7840\u8bed\u6cd5\uff08\u96f6\u57fa\u7840\u5fc5\u770b\uff09<\/h2>\n<div class=\"info-box warn\">\n  <strong>\u786c\u6027\u89c4\u5219\uff1a<\/strong>\u53ea\u80fd\u7528<strong>2\/4\u4e2a\u7a7a\u683c<\/strong>\u7f29\u8fdb\uff0c\u7981\u6b62Tab\u5236\u8868\u7b26\uff1b\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\u3002\n<\/div>\n<h3>4.1 \u952e\u503c\u5bf9\uff08\u5b57\u5178\uff0c\u5bf9\u5e94Python dict\uff09<\/h3>\n<pre class=\"code-block\"># config.yml\nname: \u5c0f\u660e\nage: 22\nis_student: true\nscore: 95.5\naddress: null\n<\/pre>\n<p>\u5bf9\u5e94Python\u7c7b\u578b\uff1a\u5b57\u7b26\u4e32\u3001\u6570\u5b57\u3001\u5e03\u5c14\u3001\u6d6e\u70b9\u6570\u3001None<\/p>\n\n<h3>4.2 \u5217\u8868\uff08\u6570\u7ec4\uff0c\u5bf9\u5e94Python list\uff09<\/h3>\n<p>\u77ed\u6a2a\u7ebf <code>-<\/code> \u5f00\u5934\u4ee3\u8868\u5217\u8868\u5143\u7d20<\/p>\n<pre class=\"code-block\"># \u666e\u901a\u5217\u8868\nhobbies:\n  - \u7bee\u7403\n  - \u770b\u4e66\n  - \u7f16\u7a0b\n\n# \u884c\u5185\u7b80\u5199\u5217\u8868\nnums: [1,2,3,4]\n<\/pre>\n\n<h3>4.3 \u5d4c\u5957\u5b57\u5178\uff08\u591a\u5c42\u914d\u7f6e\uff0c\u6700\u5e38\u7528\uff09<\/h3>\n<pre class=\"code-block\">database:\n  host: 127.0.0.1\n  port: 3306\n  user: root\n  password: 123456\n  pool:\n    max_size: 20\n    min_size: 5\n<\/pre>\n\n<h3>4.4 \u591a\u884c\u6587\u672c<\/h3>\n<pre class=\"code-block\"># | \u4fdd\u7559\u6362\u884c\ndesc: |\n  \u7b2c\u4e00\u884c\u6587\u5b57\n  \u7b2c\u4e8c\u884c\u6587\u5b57\n  \u7b2c\u4e09\u884c\n\n# > \u81ea\u52a8\u5408\u5e76\u6362\u884c\ntext: >\n  \u8fd9\u662f\u4e00\u6bb5\u5f88\u957f\u7684\u8bf4\u660e\n  \u6362\u884c\u4ec5\u4e3a\u7f8e\u89c2\n  \u8bfb\u53d6\u540e\u4f1a\u5408\u5e76\u6210\u4e00\u884c\n<\/pre>\n\n<h3>4.5 \u6ce8\u91ca<\/h3>\n<p><code>#<\/code> \u5f00\u5934\u6574\u884c\u6ce8\u91ca\uff0c\u4e0d\u80fd\u5199\u5728\u884c\u5c3e\u952e\u503c\u540e\u9762<\/p>\n<pre class=\"code-block\"># \u670d\u52a1\u914d\u7f6e\nserver:\n  port: 8000 # \u9519\u8bef\uff1a\u884c\u5c3e\u4e0d\u652f\u6301\u6ce8\u91ca\n<\/pre>\n\n<h2 id=\"zh-read\">\u4e94\u3001Python \u8bfb\u53d6 YAML \u6587\u4ef6<\/h2>\n<h3>5.1 \u51c6\u5907\u914d\u7f6e\u6587\u4ef6 config.yml<\/h3>\n<pre class=\"code-block\">app:\n  name: PythonDemo\n  debug: true\nserver:\n  host: 0.0.0.0\n  port: 8000\ndb:\n  user: root\n  pwd: 123456\n<\/pre>\n<h3>5.2 \u8bfb\u53d6\u4ee3\u7801\uff08safe_load \u5b89\u5168\u65b9\u5f0f\uff09<\/h3>\n<pre class=\"code-block\">import yaml\n\n# \u6253\u5f00yaml\u6587\u4ef6\u8bfb\u53d6\nwith open(\"config.yml\", \"r\", encoding=\"utf-8\") as f:\n    data = yaml.safe_load(f)\n\n# data \u662f\u6807\u51c6Python\u5b57\u5178dict\nprint(data[\"app\"][\"name\"])\nprint(data[\"server\"][\"port\"])\nprint(data[\"db\"][\"user\"])\n\n# \u5355\u72ec\u8bfb\u53d6\u67d0\u4e00\u5c42\nserver_config = data[\"server\"]\nprint(server_config[\"host\"])\n<\/pre>\n<div class=\"info-box\">\n  <strong>\u63a8\u8350\u4f18\u5148\u4f7f\u7528 safe_load\uff1a<\/strong>\u907f\u514d\u5371\u9669\u7684Python\u5bf9\u8c61\u5e8f\u5217\u5316\u6f0f\u6d1e\uff0c\u751f\u4ea7\u73af\u5883\u7981\u6b62\u4f7f\u7528 <code>yaml.load()<\/code>\u3002\n<\/div>\n\n<h2 id=\"zh-write\">\u516d\u3001Python \u5199\u5165\/\u4fee\u6539 YAML \u6587\u4ef6<\/h2>\n<h3>6.1 \u5199\u5165\u5168\u65b0YAML\u6587\u4ef6<\/h3>\n<pre class=\"code-block\">import yaml\n\n# Python\u5b57\u5178\u6570\u636e\ncfg = {\n    \"app\": {\"name\": \"TestApp\", \"debug\": False},\n    \"server\": {\"port\": 9000, \"host\": \"127.0.0.1\"}\n}\n\n# \u5199\u5165\u6587\u4ef6\uff0csort_keys=False \u4e0d\u81ea\u52a8\u6392\u5e8f\u952e\nwith open(\"new_config.yml\", \"w\", encoding=\"utf-8\") as f:\n    yaml.dump(cfg, f, sort_keys=False, allow_unicode=True)\n<\/pre>\n<h3>6.2 \u4fee\u6539\u5df2\u6709YAML\u914d\u7f6e<\/h3>\n<pre class=\"code-block\">import yaml\n\n# 1.\u8bfb\u53d6\u539f\u6709\u914d\u7f6e\nwith open(\"config.yml\", \"r\", encoding=\"utf-8\") as f:\n    data = yaml.safe_load(f)\n\n# 2.\u4fee\u6539\u53c2\u6570\ndata[\"server\"][\"port\"] = 8080\ndata[\"app\"][\"debug\"] = False\n\n# 3.\u5199\u56de\u539f\u6587\u4ef6\nwith open(\"config.yml\", \"w\", encoding=\"utf-8\") as f:\n    yaml.dump(data, f, sort_keys=False, allow_unicode=True)\n<\/pre>\n<div class=\"info-box warn\">\n  <strong>dump \u53c2\u6570\u8bf4\u660e\uff1a<\/strong>\n  <ul style=\"margin-left:1rem;\">\n    <li><code>sort_keys=False<\/code>\uff1a\u4fdd\u6301\u539f\u6709\u952e\u987a\u5e8f\uff0c\u4e0d\u81ea\u52a8\u6392\u5e8f<\/li>\n    <li><code>allow_unicode=True<\/code>\uff1a\u6b63\u5e38\u663e\u793a\u4e2d\u6587\uff0c\u4e0d\u4f1a\u8f6c\u4e49\\uXXXX<\/li>\n  <\/ul>\n<\/div>\n\n<h2 id=\"zh-safe\">\u4e03\u3001safe_load \u5b89\u5168\u673a\u5236\u8bf4\u660e<\/h2>\n<div class=\"card\">\n  <h4>\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u76f4\u63a5\u7528 yaml.load()\uff1f<\/h4>\n  <p>\u539f\u59cb <code>yaml.load()<\/code> \u652f\u6301\u53cd\u5e8f\u5217\u5316\u4efb\u610fPython\u5bf9\u8c61\uff0c\u5982\u679c\u5916\u90e8\u6076\u610fYAML\u6587\u4ef6\u6ce8\u5165\u5371\u9669\u4ee3\u7801\uff0c\u4f1a\u5bfc\u81f4\u670d\u52a1\u5668\u88ab\u5165\u4fb5\u3002<\/p>\n  <p><code>safe_load()<\/code> \u4ec5\u89e3\u6790\u57fa\u7840\u7c7b\u578b\uff1adict\/list\/str\/int\/bool\/None\uff0c\u5c4f\u853d\u6240\u6709\u53ef\u6267\u884c\u5bf9\u8c61\uff0c\u751f\u4ea7\u73af\u5883\u5f3a\u5236\u4f7f\u7528\u3002<\/p>\n<\/div>\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4>\u274c \u5371\u9669\u5199\u6cd5\uff08\u5e9f\u5f03\uff09<\/h4>\n<pre class=\"example\">yaml.load(f)<\/pre>\n    <p>\u5b98\u65b9\u6807\u8bb0\u4e0d\u5b89\u5168\uff0c\u65b0\u7248\u672c\u4f1a\u629b\u51fa\u8b66\u544a<\/p>\n  <\/div>\n  <div class=\"col\">\n    <h4>\u2705 \u6807\u51c6\u5b89\u5168\u5199\u6cd5<\/h4>\n<pre class=\"example\">yaml.safe_load(f)<\/pre>\n    <p>\u6240\u6709\u9879\u76ee\u7edf\u4e00\u4f7f\u7528<\/p>\n  <\/div>\n<\/div>\n\n<h2 id=\"zh-case\">\u516b\u3001\u5b8c\u6574\u5b9e\u6218\u6848\u4f8b\uff1a\u540e\u7aef\u9879\u76ee\u914d\u7f6e\u7ba1\u7406<\/h2>\n<h3>\u6b65\u9aa41\uff1a\u521b\u5efa config\/app.yml<\/h3>\n<pre class=\"code-block\"># \u9879\u76ee\u5168\u5c40\u914d\u7f6e\nenv: dev\nlog_level: INFO\n\n# \u6570\u636e\u5e93\u914d\u7f6e\nmysql:\n  host: 127.0.0.1\n  port: 3306\n  database: test_db\n  user: root\n  password: \"123456\"\n  pool_size: 10\n\n# \u8de8\u57df\u5141\u8bb8\u57df\u540d\ncors_origins:\n  - http:\/\/localhost:3000\n  - https:\/\/xxx.com\n<\/pre>\n<h3>\u6b65\u9aa42\uff1a\u5c01\u88c5\u8bfb\u53d6\u914d\u7f6e\u5de5\u5177 config_loader.py<\/h3>\n<pre class=\"code-block\">import os\nimport yaml\n\ndef load_config(yaml_path=\"config\/app.yml\"):\n    \"\"\"\u901a\u7528\u52a0\u8f7dYAML\u914d\u7f6e\u51fd\u6570\"\"\"\n    if not os.path.exists(yaml_path):\n        raise FileNotFoundError(f\"\u914d\u7f6e\u6587\u4ef6\u4e0d\u5b58\u5728\uff1a{yaml_path}\")\n    with open(yaml_path, \"r\", encoding=\"utf-8\") as f:\n        return yaml.safe_load(f)\n\n# \u5168\u5c40\u5355\u4f8b\u914d\u7f6e\nconfig = load_config()\n\nif __name__ == \"__main__\":\n    # \u6d4b\u8bd5\u8bfb\u53d6\n    print(\"\u5f53\u524d\u73af\u5883\uff1a\", config[\"env\"])\n    print(\"\u6570\u636e\u5e93\u5730\u5740\uff1a\", config[\"mysql\"][\"host\"])\n    print(\"\u8de8\u57df\u5217\u8868\uff1a\", config[\"cors_origins\"])\n<\/pre>\n<h3>\u6b65\u9aa43\uff1a\u5176\u4ed6\u6587\u4ef6\u76f4\u63a5\u5bfc\u5165\u4f7f\u7528<\/h3>\n<pre class=\"code-block\">from config_loader import config\n\n# \u76f4\u63a5\u4f7f\u7528\u914d\u7f6e\ndb_host = config[\"mysql\"][\"host\"]\ndb_port = config[\"mysql\"][\"port\"]\nprint(f\"\u8fde\u63a5\u6570\u636e\u5e93 {db_host}:{db_port}\")\n<\/pre>\n\n<h2 id=\"zh-error\">\u4e5d\u3001\u9ad8\u9891\u62a5\u9519\u4e0e\u89e3\u51b3\u529e\u6cd5<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u62a5\u9519\u73b0\u8c61<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u51b3\u65b9\u6848<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>yaml.scanner.ScannerError<\/td>\n      <td>Tab\u7f29\u8fdb \/ \u5192\u53f7\u540e\u65e0\u7a7a\u683c<\/td>\n      <td>\u5168\u90e8\u66ff\u6362\u4e3a2\/4\u7a7a\u683c\uff0ckey: \u540e\u52a0\u7a7a\u683c<\/td>\n    <\/tr>\n    <tr>\n      <td>UnicodeDecodeError<\/td>\n      <td>\u8bfb\u53d6\u6587\u4ef6\u672a\u6307\u5b9autf-8<\/td>\n      <td>open(&#8230;, encoding=&#8221;utf-8&#8243;)<\/td>\n    <\/tr>\n    <tr>\n      <td>\u4e2d\u6587\u53d8\u6210 \\uXXXX \u8f6c\u4e49\u5b57\u7b26<\/td>\n      <td>dump\u672a\u52a0allow_unicode=True<\/td>\n      <td>yaml.dump(&#8230;, allow_unicode=True)<\/td>\n    <\/tr>\n    <tr>\n      <td>DeprecationWarning: yaml.load() unsafe<\/td>\n      <td>\u4f7f\u7528\u4e86\u4e0d\u5b89\u5168load\u65b9\u6cd5<\/td>\n      <td>\u66ff\u6362\u4e3a yaml.safe_load()<\/td>\n    <\/tr>\n    <tr>\n      <td>KeyError: xxx<\/td>\n      <td>YAML\u65e0\u5bf9\u5e94\u952e\u540d\u3001\u7f29\u8fdb\u5c42\u7ea7\u9519\u8bef<\/td>\n      <td>\u68c0\u67e5yaml\u7f29\u8fdb\u4e0e\u952e\u540d\u62fc\u5199<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<h2 id=\"zh-summary\">\u5341\u3001\u6838\u5fc3\u603b\u7ed3\u901f\u67e5\u8868<\/h2>\n<div class=\"card\">\n  <h4>YAML + Python \u6838\u5fc3\u53e3\u8bc0<\/h4>\n  <p>1. \u5b89\u88c5\u4f9d\u8d56\uff1a<code>pip install pyyaml<\/code><\/p>\n  <p>2. \u8bed\u6cd5\u89c4\u5219\uff1a\u7a7a\u683c\u7f29\u8fdb\uff0c\u5192\u53f7\u540e\u7a7a\u683c\uff0c\u7981\u6b62Tab<\/p>\n  <p>3. \u8bfb\u53d6\u6587\u4ef6\uff1a<code>yaml.safe_load(\u6587\u4ef6\u5bf9\u8c61)<\/code><\/p>\n  <p>4. \u5199\u5165\u6587\u4ef6\uff1a<code>yaml.dump(data, f, sort_keys=False, allow_unicode=True)<\/code><\/p>\n  <p>5. \u5b89\u5168\u89c4\u8303\uff1a\u6c38\u8fdc\u4e0d\u7528 <code>yaml.load()<\/code><\/p>\n  <p>6. \u6570\u636e\u6620\u5c04\uff1aYAML\u5b57\u5178\u2192Python dict\uff1b\u5217\u8868\u2192Python list<\/p>\n<\/div>\n<\/div>\n\n<!-- \u82f1\u6587\u533a\u57df -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Python YAML Complete Beginner Guide<\/h1>\n  <p>What is YAML, install pyyaml, syntax, read\/write yaml file, real project demo<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-what\">1. What is YAML<\/a><\/li>\n    <li><a href=\"#en-scene\">2. Common Use Cases<\/a><\/li>\n    <li><a href=\"#en-install\">3. Install pyyaml<\/a><\/li>\n    <li><a href=\"#en-syntax\">4. Basic YAML Syntax<\/a><\/li>\n    <li><a href=\"#en-read\">5. Read YAML with Python<\/a><\/li>\n    <li><a href=\"#en-write\">6. Write &#038; Modify YAML<\/a><\/li>\n    <li><a href=\"#en-safe\">7. safe_load Security Rule<\/a><\/li>\n    <li><a href=\"#en-case\">8. Full Project Demo<\/a><\/li>\n    <li><a href=\"#en-error\">9. Common Errors &#038; Fixes<\/a><\/li>\n    <li><a href=\"#en-summary\">10. Quick Reference<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<h2 id=\"en-what\">1. What is YAML<\/h2>\n<p>YAML stands for <em>YAML Ain&#8217;t Markup Language<\/em>, a human-readable config file format with extension <code>.yml<\/code> \/ <code>.yaml<\/code>.<\/p>\n<div class=\"info-box\">\n  <strong>Key difference from JSON:<\/strong> YAML uses indentation instead of braces\/commas, cleaner for long configs.\n<\/div>\n<div class=\"card\">\n  <h4>Core Advantages<\/h4>\n  <p><span class=\"tag tag-g\">Clean syntax<\/span> No curly braces, commas or mandatory quotes<\/p>\n  <p><span class=\"tag tag-b\">Hierarchy clear<\/span> Indent with spaces only<\/p>\n  <p><span class=\"tag tag-y\">Cross-language<\/span> Python, Go, JS, Java, Kubernetes all support<\/p>\n  <p><span class=\"tag tag-p\">Industry standard<\/span> Backend, DevOps, ML training config<\/p>\n<\/div>\n\n<h2 id=\"en-scene\">2. Common Use Cases<\/h2>\n<ul style=\"margin-left:1.2rem;\">\n  <li>Application config (DB address, port, credentials, feature switches)<\/li>\n  <li>Kubernetes manifest, Docker Compose<\/li>\n  <li>CI\/CD workflow (GitHub Actions, GitLab CI)<\/li>\n  <li>FastAPI, Scrapy, Machine Learning training parameters<\/li>\n<\/ul>\n\n<h2 id=\"en-install\">3. Install pyyaml<\/h2>\n<pre class=\"code-block\"># pip install\npip install pyyaml\n\n# verify install\npython -c \"import yaml; print(yaml.__version__)\"\n<\/pre>\n\n<h2 id=\"en-syntax\">4. Basic YAML Syntax Rules<\/h2>\n<div class=\"info-box warn\">\n  <strong>Hard rule:<\/strong> Use 2\/4 spaces for indent, NO Tab characters; add space after colon <code>:<\/code>.\n<\/div>\n<h4>Key-value mapping (Python dict)<\/h4>\n<pre class=\"example\">username: Alice\nage: 24\nenabled: true\nscore: 92.5\nremark: null\n<\/pre>\n<h4>List \/ Array (Python list)<\/h4>\n<pre class=\"example\">skills:\n  - python\n  - yaml\n  - docker\ninline_list: [10,20,30]\n<\/pre>\n<h4>Nested dict<\/h4>\n<pre class=\"example\">database:\n  host: 127.0.0.1\n  port: 5432\n  pool:\n    max: 15\n<\/pre>\n\n<h2 id=\"en-read\">5. Read YAML File<\/h2>\n<pre class=\"code-block\">import yaml\n\nwith open(\"config.yml\", \"r\", encoding=\"utf-8\") as f:\n    data = yaml.safe_load(f)\n\nprint(data[\"database\"][\"host\"])\n<\/pre>\n\n<h2 id=\"en-write\">6. Write &#038; Update YAML<\/h2>\n<pre class=\"code-block\">import yaml\n\ndata = {\"server\": {\"port\": 8000, \"debug\": False}}\nwith open(\"output.yml\", \"w\", encoding=\"utf-8\") as f:\n    yaml.dump(data, f, sort_keys=False, allow_unicode=True)\n<\/pre>\n\n<h2 id=\"en-safe\">7. safe_load Security<\/h2>\n<p><code>yaml.load()<\/code> is unsafe, it can deserialize arbitrary Python objects and cause remote code execution attacks.<\/p>\n<p>Always use <code>yaml.safe_load()<\/code> in production, only parses basic types (dict, list, str, int, bool, None).<\/p>\n\n<h2 id=\"en-case\">8. Full Project Demo<\/h2>\n<pre class=\"code-block\"># config_loader.py\nimport os, yaml\n\ndef load_config(path=\"config\/app.yml\"):\n    if not os.path.exists(path):\n        raise FileNotFoundError(\"Config missing\")\n    with open(path, \"r\", encoding=\"utf-8\") as f:\n        return yaml.safe_load(f)\n\ncfg = load_config()\n<\/pre>\n\n<h2 id=\"en-error\">9. Common Errors<\/h2>\n<ul style=\"margin-left:1.2rem;\">\n  <li>ScannerError: Tab indent \/ missing space after colon<\/li>\n  <li>UnicodeDecodeError: missing encoding=&#8221;utf-8&#8243;<\/li>\n  <li>Unicode escape characters: add allow_unicode=True in dump<\/li>\n  <li>DeprecationWarning: replace load() with safe_load()<\/li>\n<\/ul>\n\n<h2 id=\"en-summary\">10. Quick Reference<\/h2>\n<div class=\"card\">\n  <h4>Core Cheat Sheet<\/h4>\n  <p>Install: <code>pip install pyyaml<\/code><\/p>\n  <p>Read: <code>yaml.safe_load(file)<\/code><\/p>\n  <p>Write: <code>yaml.dump(data, f, sort_keys=False, allow_unicode=True)<\/code><\/p>\n  <p>Safety: Never use raw yaml.load()<\/p>\n<\/div>\n<\/div>\n<\/main>\n\n<footer>\n  <div class=\"links\">\n    <a href=\"https:\/\/pyyaml.org\/\" target=\"_blank\" rel=\"noopener\">PyYAML Official<\/a>\n    <a href=\"https:\/\/yaml.org\/\" target=\"_blank\" rel=\"noopener\">YAML Spec<\/a>\n  <\/div>\n  <p>Python YAML Complete Guide \u00b7 Python YAML \u96f6\u57fa\u7840\u6559\u7a0b<\/p>\n<\/footer>\n\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(el=>el.classList.remove('active'));\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(btn=>btn.classList.remove('active'));\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.documentElement.lang = lang==='zh'?'zh-CN':'en';\n  const prefix = lang==='zh'?'zh':'en';\n  const newHash = window.location.hash.replace(\/^#(zh|en)-\/, prefix+\"-\");\n  if(newHash) window.location.hash = newHash;\n}\nfunction toggleTheme(){\n  const html = document.documentElement;\n  if(html.hasAttribute('data-theme')){\n    html.removeAttribute('data-theme');\n    localStorage.removeItem('theme');\n  }else{\n    html.setAttribute('data-theme','dark');\n    localStorage.setItem('theme','dark');\n  }\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark') document.documentElement.setAttribute('data-theme','dark');\n  const hash = window.location.hash;\n  if(hash){\n    const target = document.querySelector(hash);\n    if(target) setTimeout(()=>target.scrollIntoView({behavior:'smooth'}),100);\n  }\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Python YAML \u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b \u00b7 Python YAML Guide \ud83d\udcc4 Python YAML G [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-323","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=323"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/323\/revisions"}],"predecessor-version":[{"id":324,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/323\/revisions\/324"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}