-
-
Notifications
You must be signed in to change notification settings - Fork 214
/
Copy pathinputoutput.html
663 lines (617 loc) · 72.8 KB
/
inputoutput.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
<!DOCTYPE html>
<html lang="zh-TW" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>7. 輸入和輸出 — Python 3.13.2 說明文件</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=23252803" />
<link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />
<script src="../_static/documentation_options.js?v=9a295789"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/translations.js?v=cbf116e0"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="在 Python 3.13.2 說明文件 中搜尋"
href="../_static/opensearch.xml"/>
<link rel="author" title="關於這些文件" href="../about.html" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜尋" href="../search.html" />
<link rel="copyright" title="版權" href="../copyright.html" />
<link rel="next" title="8. 錯誤和例外" href="errors.html" />
<link rel="prev" title="6. 模組 (Module)" href="modules.html" />
<link rel="canonical" href="https://docs.python.org/3/tutorial/inputoutput.html" />
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
<script type="text/javascript" src="../_static/search-focus.js"></script>
<script type="text/javascript" src="../_static/themetoggle.js"></script>
<script type="text/javascript" src="../_static/rtd_switcher.js"></script>
<meta name="readthedocs-addons-api-version" content="1">
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<nav class="nav-content" role="navigation">
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<span class="nav-items-wrapper">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Python logo"/>
</a>
<span class="version_switcher_placeholder"></span>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
</svg>
<input placeholder="快速搜尋" aria-label="快速搜尋" type="search" name="q" />
<input type="submit" value="前往"/>
</form>
</span>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label>
<div>
<h3><a href="../contents.html">目錄</a></h3>
<ul>
<li><a class="reference internal" href="#">7. 輸入和輸出</a><ul>
<li><a class="reference internal" href="#fancier-output-formatting">7.1. 更華麗的輸出格式</a><ul>
<li><a class="reference internal" href="#formatted-string-literals">7.1.1. 格式化的字串文本 (Formatted String Literals)</a></li>
<li><a class="reference internal" href="#the-string-format-method">7.1.2. 字串的 format() method</a></li>
<li><a class="reference internal" href="#manual-string-formatting">7.1.3. 手動格式化字串</a></li>
<li><a class="reference internal" href="#old-string-formatting">7.1.4. 格式化字串的舊方法</a></li>
</ul>
</li>
<li><a class="reference internal" href="#reading-and-writing-files">7.2. 讀寫檔案</a><ul>
<li><a class="reference internal" href="#methods-of-file-objects">7.2.1. 檔案物件的 method</a></li>
<li><a class="reference internal" href="#saving-structured-data-with-json">7.2.2. 使用 <code class="xref py py-mod docutils literal notranslate"><span class="pre">json</span></code> 儲存結構化資料</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div>
<h4>上個主題</h4>
<p class="topless"><a href="modules.html"
title="上一章"><span class="section-number">6. </span>模組 (Module)</a></p>
</div>
<div>
<h4>下個主題</h4>
<p class="topless"><a href="errors.html"
title="下一章"><span class="section-number">8. </span>錯誤和例外</a></p>
</div>
<div role="note" aria-label="source link">
<h3>此頁面</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">回報錯誤</a></li>
<li>
<a href="https://github.com/python/cpython/blob/main/Doc/tutorial/inputoutput.rst"
rel="nofollow">顯示原始碼
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>瀏覽</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="總索引"
accesskey="I">索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模組索引"
>模組</a> |</li>
<li class="right" >
<a href="errors.html" title="8. 錯誤和例外"
accesskey="N">下一頁</a> |</li>
<li class="right" >
<a href="modules.html" title="6. 模組 (Module)"
accesskey="P">上一頁</a> |</li>
<li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> »</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.13.2 Documentation</a> »
</li>
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Python 教學</a> »</li>
<li class="nav-item nav-item-this"><a href=""><span class="section-number">7. </span>輸入和輸出</a></li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜尋" aria-label="快速搜尋" type="search" name="q" id="search-box" />
<input type="submit" value="前往" />
</form>
</div>
|
</li>
<li class="right">
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label> |</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="input-and-output">
<span id="tut-io"></span><h1><span class="section-number">7. </span>輸入和輸出<a class="headerlink" href="#input-and-output" title="連結到這個標頭">¶</a></h1>
<p>有數種方式可以顯示程式的輸出;資料可以以人類易讀的形式印出,或是寫入檔案以供未來所使用。這章節會討論幾種不同的方式。</p>
<section id="fancier-output-formatting">
<span id="tut-formatting"></span><h2><span class="section-number">7.1. </span>更華麗的輸出格式<a class="headerlink" href="#fancier-output-formatting" title="連結到這個標頭">¶</a></h2>
<p>目前為止我們已經學過兩種寫值的方式:<em>運算式陳述 (expression statements)</em> 與 <a class="reference internal" href="../library/functions.html#print" title="print"><code class="xref py py-func docutils literal notranslate"><span class="pre">print()</span></code></a> 函式。(第三種方法是使用檔案物件的 <a class="reference internal" href="../library/io.html#io.TextIOBase.write" title="io.TextIOBase.write"><code class="xref py py-meth docutils literal notranslate"><span class="pre">write()</span></code></a> 方法;標準輸出的檔案是使用 <code class="docutils literal notranslate"><span class="pre">sys.stdout</span></code> 來達成的。詳細的資訊請參考對應的函式庫說明。)</p>
<p>通常你會想要對輸出格式有更多地控制,而不是僅列印出以空格隔開的值。以下是幾種格式化輸出的方式。</p>
<ul>
<li><p>要使用<a class="reference internal" href="#tut-f-strings"><span class="std std-ref">格式化字串文本 (formatted string literals)</span></a>,需在字串開始前的引號或連續三個引號前加上 <code class="docutils literal notranslate"><span class="pre">f</span></code> 或 <code class="docutils literal notranslate"><span class="pre">F</span></code>。你可以在這個字串中使用 <code class="docutils literal notranslate"><span class="pre">{</span></code> 與 <code class="docutils literal notranslate"><span class="pre">}</span></code> 包夾 Python 的運算式,引用變數或其他字面值 (literal values)。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">year</span> <span class="o">=</span> <span class="mi">2016</span>
<span class="gp">>>> </span><span class="n">event</span> <span class="o">=</span> <span class="s1">'Referendum'</span>
<span class="gp">>>> </span><span class="sa">f</span><span class="s1">'Results of the </span><span class="si">{</span><span class="n">year</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">event</span><span class="si">}</span><span class="s1">'</span>
<span class="go">'Results of the 2016 Referendum'</span>
</pre></div>
</div>
</li>
<li><p>字串的 <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> method 需要更多手動操作。你還是可以用 <code class="docutils literal notranslate"><span class="pre">{</span></code> 和 <code class="docutils literal notranslate"><span class="pre">}</span></code> 標示欲替代變數的位置,且可給予詳細的格式指令,但你也需提供要被格式化的資訊。在以下程式碼區塊中,有兩個如何格式化變數的範例:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">yes_votes</span> <span class="o">=</span> <span class="mi">42_572_654</span>
<span class="gp">>>> </span><span class="n">total_votes</span> <span class="o">=</span> <span class="mi">85_705_149</span>
<span class="gp">>>> </span><span class="n">percentage</span> <span class="o">=</span> <span class="n">yes_votes</span> <span class="o">/</span> <span class="n">total_votes</span>
<span class="gp">>>> </span><span class="s1">'</span><span class="si">{:-9}</span><span class="s1"> YES votes </span><span class="si">{:2.2%}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">yes_votes</span><span class="p">,</span> <span class="n">percentage</span><span class="p">)</span>
<span class="go">' 42572654 YES votes 49.67%'</span>
</pre></div>
</div>
<p>請注意 <code class="docutils literal notranslate"><span class="pre">yes_votes</span></code> 如何對於負數用空格和負號填補。該範例還會列出 <code class="docutils literal notranslate"><span class="pre">percentage</span></code> 乘以 100,並保留 2 位小數且後面跟著一個百分號(有關詳細資訊,請參閱 <a class="reference internal" href="../library/string.html#formatspec"><span class="std std-ref">格式規格 (Format Specification) 迷你語言</span></a>)。</p>
</li>
<li><p>最後,你還可以自己用字串切片 (slicing) 和串接 (concatenation) 操作,完成所有的字串處理,建立任何你能想像的排版格式。字串型別有一些 method,能以給定的欄寬填補字串,這些運算也很有用。</p></li>
</ul>
<p>如果你不需要華麗的輸出,只想快速顯示變數以進行除錯,可以用 <a class="reference internal" href="../library/functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a> 或 <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a> 函式把任何的值轉換為字串。</p>
<p><a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a> 函式的用意是回傳一個人類易讀的表示法,而 <a class="reference internal" href="../library/functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a> 的用意是產生直譯器可讀取的表示法(如果沒有等效的語法,則造成 <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>)。如果物件沒有人類易讀的特定表示法,<a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a> 會回傳與 <a class="reference internal" href="../library/functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a> 相同的值。有許多的值,像是數字,或 list 及 dictionary 等結構,使用這兩個函式會有相同的表示法。而字串,則較為特別,有兩種不同的表示法。</p>
<p>一些範例:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="s1">'Hello, world.'</span>
<span class="gp">>>> </span><span class="nb">str</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="go">'Hello, world.'</span>
<span class="gp">>>> </span><span class="nb">repr</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="go">"'Hello, world.'"</span>
<span class="gp">>>> </span><span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">7</span><span class="p">)</span>
<span class="go">'0.14285714285714285'</span>
<span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">*</span> <span class="mf">3.25</span>
<span class="gp">>>> </span><span class="n">y</span> <span class="o">=</span> <span class="mi">200</span> <span class="o">*</span> <span class="mi">200</span>
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="s1">'The value of x is '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="s1">', and y is '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'...'</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="go">The value of x is 32.5, and y is 40000...</span>
<span class="gp">>>> </span><span class="c1"># The repr() of a string adds string quotes and backslashes:</span>
<span class="gp">>>> </span><span class="n">hello</span> <span class="o">=</span> <span class="s1">'hello, world</span><span class="se">\n</span><span class="s1">'</span>
<span class="gp">>>> </span><span class="n">hellos</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">hello</span><span class="p">)</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">hellos</span><span class="p">)</span>
<span class="go">'hello, world\n'</span>
<span class="gp">>>> </span><span class="c1"># The argument to repr() may be any Python object:</span>
<span class="gp">>>> </span><span class="nb">repr</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">(</span><span class="s1">'spam'</span><span class="p">,</span> <span class="s1">'eggs'</span><span class="p">)))</span>
<span class="go">"(32.5, 40000, ('spam', 'eggs'))"</span>
</pre></div>
</div>
<p><a class="reference internal" href="../library/string.html#module-string" title="string: Common string operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">string</span></code></a> 模組包含一個 <a class="reference internal" href="../library/string.html#string.Template" title="string.Template"><code class="xref py py-class docutils literal notranslate"><span class="pre">Template</span></code></a> class(類別),提供了將值替代為字串的另一種方法。該方法使用 <code class="docutils literal notranslate"><span class="pre">$x</span></code> 佔位符號,並以 dictionary 的值進行取代,但對格式的控制明顯較少。</p>
<section id="formatted-string-literals">
<span id="tut-f-strings"></span><span id="index-0"></span><h3><span class="section-number">7.1.1. </span>格式化的字串文本 (Formatted String Literals)<a class="headerlink" href="#formatted-string-literals" title="連結到這個標頭">¶</a></h3>
<p><a class="reference internal" href="../reference/lexical_analysis.html#f-strings"><span class="std std-ref">格式化的字串文本</span></a>(簡稱為 f-字串),透過在字串加入前綴 <code class="docutils literal notranslate"><span class="pre">f</span></code> 或 <code class="docutils literal notranslate"><span class="pre">F</span></code>,並將運算式編寫為 <code class="docutils literal notranslate"><span class="pre">{expression}</span></code>,讓你可以在字串內加入 Python 運算式的值。</p>
<p>格式說明符 (format specifier) 是選擇性的,寫在運算式後面,可以更好地控制值的格式化方式。以下範例將 pi 捨入到小數點後三位:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span><span class="w"> </span><span class="nn">math</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'The value of pi is approximately </span><span class="si">{</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="si">:</span><span class="s1">.3f</span><span class="si">}</span><span class="s1">.'</span><span class="p">)</span>
<span class="go">The value of pi is approximately 3.142.</span>
</pre></div>
</div>
<p>在 <code class="docutils literal notranslate"><span class="pre">':'</span></code> 後傳遞一個整數,可以設定該欄位至少為幾個字元寬,常用於將每一欄對齊。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">table</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Sjoerd'</span><span class="p">:</span> <span class="mi">4127</span><span class="p">,</span> <span class="s1">'Jack'</span><span class="p">:</span> <span class="mi">4098</span><span class="p">,</span> <span class="s1">'Dcab'</span><span class="p">:</span> <span class="mi">7678</span><span class="p">}</span>
<span class="gp">>>> </span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">phone</span> <span class="ow">in</span> <span class="n">table</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s1">10</span><span class="si">}</span><span class="s1"> ==> </span><span class="si">{</span><span class="n">phone</span><span class="si">:</span><span class="s1">10d</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="gp">...</span>
<span class="go">Sjoerd ==> 4127</span>
<span class="go">Jack ==> 4098</span>
<span class="go">Dcab ==> 7678</span>
</pre></div>
</div>
<p>還有一些修飾符號可以在格式化前先將值轉換過。<code class="docutils literal notranslate"><span class="pre">'!a'</span></code> 會套用 <a class="reference internal" href="../library/functions.html#ascii" title="ascii"><code class="xref py py-func docutils literal notranslate"><span class="pre">ascii()</span></code></a>,<code class="docutils literal notranslate"><span class="pre">'!s'</span></code> 會套用 <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a>,<code class="docutils literal notranslate"><span class="pre">'!r'</span></code> 會套用 <a class="reference internal" href="../library/functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a>:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">animals</span> <span class="o">=</span> <span class="s1">'eels'</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'My hovercraft is full of </span><span class="si">{</span><span class="n">animals</span><span class="si">}</span><span class="s1">.'</span><span class="p">)</span>
<span class="go">My hovercraft is full of eels.</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'My hovercraft is full of </span><span class="si">{</span><span class="n">animals</span><span class="si">!r}</span><span class="s1">.'</span><span class="p">)</span>
<span class="go">My hovercraft is full of 'eels'.</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">=</span></code> 說明符可用於將一個運算式擴充為該運算式的文字、一個等號、以及對該運算式求值 (evaluate) 後的表示法:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">bugs</span> <span class="o">=</span> <span class="s1">'roaches'</span>
<span class="gp">>>> </span><span class="n">count</span> <span class="o">=</span> <span class="mi">13</span>
<span class="gp">>>> </span><span class="n">area</span> <span class="o">=</span> <span class="s1">'living room'</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Debugging </span><span class="si">{</span><span class="n">bugs</span><span class="si">=}</span><span class="s1"> </span><span class="si">{</span><span class="n">count</span><span class="si">=}</span><span class="s1"> </span><span class="si">{</span><span class="n">area</span><span class="si">=}</span><span class="s1">'</span><span class="p">)</span>
<span class="go">Debugging bugs='roaches' count=13 area='living room'</span>
</pre></div>
</div>
<p>更多關於 <code class="docutils literal notranslate"><span class="pre">=</span></code> 說明符的資訊請見<a class="reference internal" href="../whatsnew/3.8.html#bpo-36817-whatsnew"><span class="std std-ref">自文件性運算式 (self-documenting expressions)</span></a>。若要參考這些格式化字串的規格,詳見 <a class="reference internal" href="../library/string.html#formatspec"><span class="std std-ref">格式規格 (Format Specification) 迷你語言</span></a> 參考指南。</p>
</section>
<section id="the-string-format-method">
<span id="tut-string-format"></span><h3><span class="section-number">7.1.2. </span>字串的 format() method<a class="headerlink" href="#the-string-format-method" title="連結到這個標頭">¶</a></h3>
<p><a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> method 的基本用法如下:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'We are the </span><span class="si">{}</span><span class="s1"> who say "</span><span class="si">{}</span><span class="s1">!"'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'knights'</span><span class="p">,</span> <span class="s1">'Ni'</span><span class="p">))</span>
<span class="go">We are the knights who say "Ni!"</span>
</pre></div>
</div>
<p>大括號及其內的字元(稱為格式欄位)會被取代為傳遞給 <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> method 的物件。大括號中的數字表示該物件在傳遞給 <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> method 時所在的位置。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{0}</span><span class="s1"> and </span><span class="si">{1}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'spam'</span><span class="p">,</span> <span class="s1">'eggs'</span><span class="p">))</span>
<span class="go">spam and eggs</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{1}</span><span class="s1"> and </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'spam'</span><span class="p">,</span> <span class="s1">'eggs'</span><span class="p">))</span>
<span class="go">eggs and spam</span>
</pre></div>
</div>
<p>如果在 <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> method 中使用關鍵字引數,可以使用引數名稱去引用它們的值。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'This </span><span class="si">{food}</span><span class="s1"> is </span><span class="si">{adjective}</span><span class="s1">.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="gp">... </span> <span class="n">food</span><span class="o">=</span><span class="s1">'spam'</span><span class="p">,</span> <span class="n">adjective</span><span class="o">=</span><span class="s1">'absolutely horrible'</span><span class="p">))</span>
<span class="go">This spam is absolutely horrible.</span>
</pre></div>
</div>
<p>位置引數和關鍵字引數可以任意組合:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'The story of </span><span class="si">{0}</span><span class="s1">, </span><span class="si">{1}</span><span class="s1">, and </span><span class="si">{other}</span><span class="s1">.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'Bill'</span><span class="p">,</span> <span class="s1">'Manfred'</span><span class="p">,</span>
<span class="gp">... </span> <span class="n">other</span><span class="o">=</span><span class="s1">'Georg'</span><span class="p">))</span>
<span class="go">The story of Bill, Manfred, and Georg.</span>
</pre></div>
</div>
<p>如果你有一個不想分割的長格式化字串,比較好的方式是按名稱而不是按位置來引用變數。這項操作可以透過傳遞字典 (dict),並用方括號 <code class="docutils literal notranslate"><span class="pre">'[]'</span></code> 使用鍵 (key) 來輕鬆完成。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">table</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Sjoerd'</span><span class="p">:</span> <span class="mi">4127</span><span class="p">,</span> <span class="s1">'Jack'</span><span class="p">:</span> <span class="mi">4098</span><span class="p">,</span> <span class="s1">'Dcab'</span><span class="p">:</span> <span class="mi">8637678</span><span class="p">}</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'Jack: </span><span class="si">{0[Jack]:d}</span><span class="s1">; Sjoerd: </span><span class="si">{0[Sjoerd]:d}</span><span class="s1">; '</span>
<span class="gp">... </span> <span class="s1">'Dcab: </span><span class="si">{0[Dcab]:d}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">table</span><span class="p">))</span>
<span class="go">Jack: 4098; Sjoerd: 4127; Dcab: 8637678</span>
</pre></div>
</div>
<p>用 '**' 符號,把 <code class="docutils literal notranslate"><span class="pre">table</span></code> 字典當作關鍵字引數來傳遞,也有一樣的結果。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">table</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Sjoerd'</span><span class="p">:</span> <span class="mi">4127</span><span class="p">,</span> <span class="s1">'Jack'</span><span class="p">:</span> <span class="mi">4098</span><span class="p">,</span> <span class="s1">'Dcab'</span><span class="p">:</span> <span class="mi">8637678</span><span class="p">}</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'Jack: </span><span class="si">{Jack:d}</span><span class="s1">; Sjoerd: </span><span class="si">{Sjoerd:d}</span><span class="s1">; Dcab: </span><span class="si">{Dcab:d}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">table</span><span class="p">))</span>
<span class="go">Jack: 4098; Sjoerd: 4127; Dcab: 8637678</span>
</pre></div>
</div>
<p>與內建函式 <a class="reference internal" href="../library/functions.html#vars" title="vars"><code class="xref py py-func docutils literal notranslate"><span class="pre">vars()</span></code></a> 組合使用時,這種方式特別實用。該函式可以回傳一個包含所有區域變數的 dictionary:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">table</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="gp">>>> </span><span class="n">message</span> <span class="o">=</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s1">: '</span> <span class="o">+</span> <span class="s1">'{'</span> <span class="o">+</span> <span class="n">k</span> <span class="o">+</span><span class="s1">'};'</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">table</span><span class="o">.</span><span class="n">keys</span><span class="p">()])</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">table</span><span class="p">))</span>
<span class="go">__name__: __main__; __doc__: None; __package__: None; __loader__: ...</span>
</pre></div>
</div>
<p>例如,下面的程式碼產生一組排列整齊的欄,列出整數及其平方與立方:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{0:2d}</span><span class="s1"> </span><span class="si">{1:3d}</span><span class="s1"> </span><span class="si">{2:4d}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">))</span>
<span class="gp">...</span>
<span class="go"> 1 1 1</span>
<span class="go"> 2 4 8</span>
<span class="go"> 3 9 27</span>
<span class="go"> 4 16 64</span>
<span class="go"> 5 25 125</span>
<span class="go"> 6 36 216</span>
<span class="go"> 7 49 343</span>
<span class="go"> 8 64 512</span>
<span class="go"> 9 81 729</span>
<span class="go">10 100 1000</span>
</pre></div>
</div>
<p>關於使用 <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> 進行字串格式化的完整概述,請見<a class="reference internal" href="../library/string.html#formatstrings"><span class="std std-ref">格式化文字語法</span></a>。</p>
</section>
<section id="manual-string-formatting">
<h3><span class="section-number">7.1.3. </span>手動格式化字串<a class="headerlink" href="#manual-string-formatting" title="連結到這個標頭">¶</a></h3>
<p>下面是以手動格式化完成的同一個平方及立方的表:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
<span class="gp">... </span> <span class="c1"># 注意前一列使用的 'end'</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span>
<span class="gp">...</span>
<span class="go"> 1 1 1</span>
<span class="go"> 2 4 8</span>
<span class="go"> 3 9 27</span>
<span class="go"> 4 16 64</span>
<span class="go"> 5 25 125</span>
<span class="go"> 6 36 216</span>
<span class="go"> 7 49 343</span>
<span class="go"> 8 64 512</span>
<span class="go"> 9 81 729</span>
<span class="go">10 100 1000</span>
</pre></div>
</div>
<p>(請注意,使用 <a class="reference internal" href="../library/functions.html#print" title="print"><code class="xref py py-func docutils literal notranslate"><span class="pre">print()</span></code></a> 讓每欄之間加入一個空格的方法:這種方法總是在其引數間加入空格。)</p>
<p>字串物件的 <a class="reference internal" href="../library/stdtypes.html#str.rjust" title="str.rjust"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.rjust()</span></code></a> method 透過在左側填補空格,使字串以給定的欄寬進行靠右對齊。類似的 method 還有 <a class="reference internal" href="../library/stdtypes.html#str.ljust" title="str.ljust"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.ljust()</span></code></a> 和 <a class="reference internal" href="../library/stdtypes.html#str.center" title="str.center"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.center()</span></code></a>。這些 method 不寫入任何內容,只回傳一個新字串,如果輸入的字串太長,它們不會截斷字串,而是不做任何改變地回傳;雖然這樣會弄亂欄的編排,但這通常還是比另一種情況好,那種情況會讓值變得不正確。(如果你真的想截斷字串,可以加入像 <code class="docutils literal notranslate"><span class="pre">x.ljust(n)[:n]</span></code> 這樣的切片運算。)</p>
<p>另一種 method 是 <a class="reference internal" href="../library/stdtypes.html#str.zfill" title="str.zfill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.zfill()</span></code></a>,可在數值字串的左邊填補零,且能識別正負號:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s1">'12'</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="go">'00012'</span>
<span class="gp">>>> </span><span class="s1">'-3.14'</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
<span class="go">'-003.14'</span>
<span class="gp">>>> </span><span class="s1">'3.14159265359'</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="go">'3.14159265359'</span>
</pre></div>
</div>
</section>
<section id="old-string-formatting">
<h3><span class="section-number">7.1.4. </span>格式化字串的舊方法<a class="headerlink" href="#old-string-formatting" title="連結到這個標頭">¶</a></h3>
<p>% 運算子(modulo,模數)也可用於字串格式化。在 <code class="docutils literal notranslate"><span class="pre">format</span> <span class="pre">%</span> <span class="pre">values</span></code> 中(其中 <em>format</em> 是個字串),<em>format</em> 內的 <code class="docutils literal notranslate"><span class="pre">%</span></code> 轉換規格會被 <em>values</em> 的零個或多個元素所取代。此運算常被稱為字串插值 (string interpolation)。例如:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span><span class="w"> </span><span class="nn">math</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="s1">'The value of pi is approximately </span><span class="si">%5.3f</span><span class="s1">.'</span> <span class="o">%</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
<span class="go">The value of pi is approximately 3.142.</span>
</pre></div>
</div>
<p>更多資訊請見 <a class="reference internal" href="../library/stdtypes.html#old-string-formatting"><span class="std std-ref">printf-style String Formatting</span></a>小節。</p>
</section>
</section>
<section id="reading-and-writing-files">
<span id="tut-files"></span><h2><span class="section-number">7.2. </span>讀寫檔案<a class="headerlink" href="#reading-and-writing-files" title="連結到這個標頭">¶</a></h2>
<p id="index-1"><a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a> 回傳一個 <a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file object</span></a>,而它最常使用的兩個位置引數和一個關鍵字引數是:<code class="docutils literal notranslate"><span class="pre">open(filename,</span> <span class="pre">mode,</span> <span class="pre">encoding=None)</span></code></p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'workfile'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">)</span>
</pre></div>
</div>
<p>第一個引數是一個包含檔案名稱的字串。第二個引數是另一個字串,包含了描述檔案使用方式的幾個字元。<em>mode</em> 為 <code class="docutils literal notranslate"><span class="pre">'r'</span></code> 時,表示以唯讀模式開啟檔案;為 <code class="docutils literal notranslate"><span class="pre">'w'</span></code> 時,表示以唯寫模式開啟檔案(已存在的同名檔案會被抹除);為 <code class="docutils literal notranslate"><span class="pre">'a'</span></code> 時,以附加內容為目的開啟檔案,任何寫入檔案的資料會自動被加入到檔案的結尾。<code class="docutils literal notranslate"><span class="pre">'r+'</span></code> 可以開啟檔案並進行讀取和寫入。<em>mode</em> 引數是選擇性的,若省略時會預設為 <code class="docutils literal notranslate"><span class="pre">'r'</span></code>。</p>
<p>通常,檔案以 <em class="dfn">text mode</em> 開啟,意即,從檔案中讀取或寫入字串時,都以特定編碼方式 <em>encoding</em> 進行編碼。如未指定 <em>encoding</em>,則預設值會取決於系統平台(見 <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a>)。因為 UTF-8 是現時的標準,除非你很清楚該用什麼編碼,否則推薦使用 <code class="docutils literal notranslate"><span class="pre">encoding="utf-8"</span></code>。在 mode 後面加上 <code class="docutils literal notranslate"><span class="pre">'b'</span></code> 會以 <em class="dfn">binary mode</em>(二進制模式)開啟檔案,二進制模式資料以 <a class="reference internal" href="../library/stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> 物件的形式被讀寫。以二進制模式開啟檔案時不可以指定 <em>encoding</em>。</p>
<p>在文字模式 (text mode) 下,讀取時會預設把平台特定的行尾符號(Unix 上為 <code class="docutils literal notranslate"><span class="pre">\n</span></code>,Windows 上為 <code class="docutils literal notranslate"><span class="pre">\r\n</span></code>)轉換為 <code class="docutils literal notranslate"><span class="pre">\n</span></code>。在文字模式下寫入時,預設會把 <code class="docutils literal notranslate"><span class="pre">\n</span></code> 出現之處轉換回平台特定的行尾符號。這種在幕後對檔案資料的修改方式對文字檔案來說沒有問題,但會毀壞像是 <code class="file docutils literal notranslate"><span class="pre">JPEG</span></code> 或 <code class="file docutils literal notranslate"><span class="pre">EXE</span></code> 檔案中的二進制資料。在讀寫此類檔案時,注意一定要使用二進制模式。</p>
<p>在處理檔案物件時,使用 <a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a> 關鍵字是個好習慣。優點是,當它的套件結束後,即使在某個時刻引發了例外,檔案仍會正確地被關閉。使用 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code> 也比寫等效的 <a class="reference internal" href="../reference/compound_stmts.html#try"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code></a>-<a class="reference internal" href="../reference/compound_stmts.html#finally"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">finally</span></code></a> 區塊,來得簡短許多:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'workfile'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="gp">... </span> <span class="n">read_data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="gp">>>> </span><span class="c1"># 我們可以檢查確認該檔案已經自動被關閉。</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">closed</span>
<span class="go">True</span>
</pre></div>
</div>
<p>如果你沒有使用 <a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a> 關鍵字,則應呼叫 <code class="docutils literal notranslate"><span class="pre">f.close()</span></code> 關閉檔案,可以立即釋放被它所使用的系統資源。</p>
<div class="admonition warning">
<p class="admonition-title">警告</p>
<p>呼叫 <code class="docutils literal notranslate"><span class="pre">f.write()</span></code> 時,若未使用 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code> 關鍵字或呼叫 <code class="docutils literal notranslate"><span class="pre">f.close()</span></code>,即使程式成功退出,也<strong>可能</strong>導致 <code class="docutils literal notranslate"><span class="pre">f.write()</span></code> 的引數沒有被完全寫入硬碟。</p>
</div>
<p>不論是透過 <a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a> 陳述式,或呼叫 <code class="docutils literal notranslate"><span class="pre">f.close()</span></code> 關閉一個檔案物件之後,嘗試使用該檔案物件將會自動失效。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">ValueError</span>: <span class="n">I/O operation on closed file.</span>
</pre></div>
</div>
<section id="methods-of-file-objects">
<span id="tut-filemethods"></span><h3><span class="section-number">7.2.1. </span>檔案物件的 method<a class="headerlink" href="#methods-of-file-objects" title="連結到這個標頭">¶</a></h3>
<p>本節其餘的範例皆假設一個名為 <code class="docutils literal notranslate"><span class="pre">f</span></code> 的檔案物件已被建立。</p>
<p>要讀取檔案的內容,可呼叫 <code class="docutils literal notranslate"><span class="pre">f.read(size)</span></code>,它可讀取一部份的資料,並以字串(文字模式)或位元組串物件(二進制模式)形式回傳。<em>size</em> 是個選擇性的數字引數。當 <em>size</em> 被省略或為負數時,檔案的全部內容會被讀取並回傳;如果檔案是機器記憶體容量的兩倍大時,這會是你的問題。否則,最多只有等同於 <em>size</em> 數量的字元(文字模式)或 <em>size</em> 數量的位元組串(二進制模式)會被讀取及回傳。如果之前已經到達檔案的末端,<code class="docutils literal notranslate"><span class="pre">f.read()</span></code> 會回傳空字串(<code class="docutils literal notranslate"><span class="pre">''</span></code>)。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="go">'This is the entire file.\n'</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="go">''</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">f.readline()</span></code> 從檔案中讀取單獨一行;換行字元(<code class="docutils literal notranslate"><span class="pre">\n</span></code>)會被留在字串的結尾,只有當檔案末端不是換行字元時,它才會在檔案的最後一行被省略。這種方式讓回傳值清晰明確;只要 <code class="docutils literal notranslate"><span class="pre">f.readline()</span></code> 回傳一個空字串,就表示已經到達了檔案末端,而空白行的表示法是 <code class="docutils literal notranslate"><span class="pre">'\n'</span></code>,也就是只含一個換行字元的字串。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
<span class="go">'This is the first line of the file.\n'</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
<span class="go">'Second line of the file\n'</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
<span class="go">''</span>
</pre></div>
</div>
<p>想從檔案中讀取多行時,可以對檔案物件進行迴圈。這種方法能有效地使用記憶體、快速,且程式碼簡潔:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span>
<span class="gp">...</span>
<span class="go">This is the first line of the file.</span>
<span class="go">Second line of the file</span>
</pre></div>
</div>
<p>如果你想把一個檔案的所有行讀進一個 list 裡,可以用 <code class="docutils literal notranslate"><span class="pre">list(f)</span></code> 或 <code class="docutils literal notranslate"><span class="pre">f.readlines()</span></code>。</p>
<p><code class="docutils literal notranslate"><span class="pre">f.write(string)</span></code> 把 <em>string</em> 的內容寫入檔案,並回傳寫入的字元數。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'This is a test</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="go">15</span>
</pre></div>
</div>
<p>寫入其他類型的物件之前,要先把它們轉換為字串(文字模式)或位元組串物件(二進制模式):</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'the answer'</span><span class="p">,</span> <span class="mi">42</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="c1"># 將元組轉換成字串</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="go">18</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">f.tell()</span></code> 回傳一個整數,它給出檔案物件在檔案中的當前位置,在二進制模式下表示為檔案開始至今的位元組數,在文字模式下表示為一個意義不明的數字。</p>
<p>使用 <code class="docutils literal notranslate"><span class="pre">f.seek(offset,</span> <span class="pre">whence)</span></code> 可以改變檔案物件的位置。位置計算方法是從一個參考點增加 <em>offset</em> 的偏移量;參考點則由引數 <em>whence</em> 來選擇。當 <em>whence</em> 值為 0 時,表示使用檔案開頭,1 表示使用當前的檔案位置,2 表示使用檔案末端作為參考點。<em>whence</em> 可省略,其預設值為 0,即以檔案開頭作為參考點。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'workfile'</span><span class="p">,</span> <span class="s1">'rb+'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s1">'0123456789abcdef'</span><span class="p">)</span>
<span class="go">16</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="c1"># 跳到檔案中的第六個位元組</span>
<span class="go">5</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="go">b'5'</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># 跳到結尾前的第三個位元組</span>
<span class="go">13</span>
<span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="go">b'd'</span>
</pre></div>
</div>
<p>在文字檔案(開啟時模式字串未加入 <code class="docutils literal notranslate"><span class="pre">b</span></code> 的檔案)中,只允許以檔案開頭為參考點進行尋找(但 <code class="docutils literal notranslate"><span class="pre">seek(0,</span> <span class="pre">2)</span></code> 尋找檔案最末端是例外),且只有從 <code class="docutils literal notranslate"><span class="pre">f.tell()</span></code> 回傳的值,或是 0,才是有效的 <em>offset</em> 值。其他任何 <em>offset</em> 值都會產生未定義的行為。</p>
<p>檔案物件還有一些附加的 method,像是較不常使用的 <a class="reference internal" href="../library/io.html#io.IOBase.isatty" title="io.IOBase.isatty"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isatty()</span></code></a> 和 <a class="reference internal" href="../library/io.html#io.IOBase.truncate" title="io.IOBase.truncate"><code class="xref py py-meth docutils literal notranslate"><span class="pre">truncate()</span></code></a>;檔案物件的完整指南詳見程式庫參考手冊。</p>
</section>
<section id="saving-structured-data-with-json">
<span id="tut-json"></span><h3><span class="section-number">7.2.2. </span>使用 <a class="reference internal" href="../library/json.html#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal notranslate"><span class="pre">json</span></code></a> 儲存結構化資料<a class="headerlink" href="#saving-structured-data-with-json" title="連結到這個標頭">¶</a></h3>
<p id="index-2">字串可以簡單地從檔案中被寫入和讀取。數字則稍嫌麻煩,因為 <a class="reference internal" href="../library/io.html#io.TextIOBase.read" title="io.TextIOBase.read"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read()</span></code></a> method 只回傳字串,這些字串必須傳遞給像 <a class="reference internal" href="../library/functions.html#int" title="int"><code class="xref py py-func docutils literal notranslate"><span class="pre">int()</span></code></a> 這樣的函式,它接受 <code class="docutils literal notranslate"><span class="pre">'123'</span></code> 這樣的字串,並回傳數值 123。當你想儲存像是巢狀 list 和 dictionary(字典)等複雜的資料類型時,手動剖析 (parsing) 和序列化 (serializing) 就變得複雜。</p>
<p>相較於讓使用者不斷地編寫和除錯程式碼才能把複雜的資料類型儲存到檔案,Python 支援一個普及的資料交換格式,稱為 <a class="reference external" href="https://json.org">JSON (JavaScript Object Notation)</a>。標準模組 <a class="reference internal" href="../library/json.html#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal notranslate"><span class="pre">json</span></code></a> 可接收 Python 資料階層,並將它們轉換為字串表示法;這個過程稱為 <em class="dfn">serializing</em>(序列化)。從字串表示法中重建資料則稱為 <em class="dfn">deserializing</em>(反序列化)。在序列化和反序列化之間,表示物件的字串可以被儲存在檔案或資料中,或通過網路連接發送到遠端的機器。</p>
<div class="admonition note">
<p class="admonition-title">備註</p>
<p>JSON 格式經常地使用於現代應用程式的資料交換。許多程序設計師早已對它耳熟能詳,使它成為提升互操作性 (interoperability) 的好選擇。</p>
</div>
<p>如果你有一個物件 <code class="docutils literal notranslate"><span class="pre">x</span></code>,只需一行簡單的程式碼即可檢視它的 JSON 字串表示法:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
<span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'simple'</span><span class="p">,</span> <span class="s1">'list'</span><span class="p">]</span>
<span class="gp">>>> </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="go">'[1, "simple", "list"]'</span>
</pre></div>
</div>
<p><a class="reference internal" href="../library/json.html#json.dumps" title="json.dumps"><code class="xref py py-func docutils literal notranslate"><span class="pre">dumps()</span></code></a> 函式有一個變體,稱為 <a class="reference internal" href="../library/json.html#json.dump" title="json.dump"><code class="xref py py-func docutils literal notranslate"><span class="pre">dump()</span></code></a>,它單純地將物件序列化為 <a class="reference internal" href="../glossary.html#term-text-file"><span class="xref std std-term">text file</span></a>。因此,如果 <code class="docutils literal notranslate"><span class="pre">f</span></code> 是一個為了寫入而開啟的 <a class="reference internal" href="../glossary.html#term-text-file"><span class="xref std std-term">text file</span></a> 物件,我們可以這樣做:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
</pre></div>
</div>
<p>若 <code class="docutils literal notranslate"><span class="pre">f</span></code> 是一個已開啟、可讀取的 <a class="reference internal" href="../glossary.html#term-binary-file"><span class="xref std std-term">binary file</span></a> 或 <a class="reference internal" href="../glossary.html#term-text-file"><span class="xref std std-term">text file</span></a> 物件,要再次解碼物件的話:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">備註</p>
<p>JSON 檔案必須以 UTF-8 格式編碼。在開啟 JSON 檔案以作為一個可讀取與寫入的 <a class="reference internal" href="../glossary.html#term-text-file"><span class="xref std std-term">text file</span></a> 時,要用 <code class="docutils literal notranslate"><span class="pre">encoding="utf-8"</span></code>。</p>
</div>
<p>這種簡單的序列化技術可以處理 list 和 dictionary,但要在 JSON 中序列化任意的 class(類別)實例,則需要一些額外的工作。<a class="reference internal" href="../library/json.html#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal notranslate"><span class="pre">json</span></code></a> 模組的參考資料包含對此的說明。</p>
<div class="admonition seealso">
<p class="admonition-title">也參考</p>
<p><a class="reference internal" href="../library/pickle.html#module-pickle" title="pickle: Convert Python objects to streams of bytes and back."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pickle</span></code></a> - pickle 模組</p>
<p>與 <a class="reference internal" href="#tut-json"><span class="std std-ref">JSON</span></a> 不同,<em>pickle</em> 是一種允許對任意的複雜 Python 物件進行序列化的協定。因此,它為 Python 所特有,不能用於與其他語言編寫的應用程式溝通。在預設情況,它也是不安全的:如果資料是由手段高明的攻擊者精心設計,將這段來自於不受信任來源的 pickle 資料反序列化,可以執行任意的程式碼。</p>
</div>
</section>
</section>
</section>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<div>
<h3><a href="../contents.html">目錄</a></h3>
<ul>
<li><a class="reference internal" href="#">7. 輸入和輸出</a><ul>
<li><a class="reference internal" href="#fancier-output-formatting">7.1. 更華麗的輸出格式</a><ul>
<li><a class="reference internal" href="#formatted-string-literals">7.1.1. 格式化的字串文本 (Formatted String Literals)</a></li>
<li><a class="reference internal" href="#the-string-format-method">7.1.2. 字串的 format() method</a></li>
<li><a class="reference internal" href="#manual-string-formatting">7.1.3. 手動格式化字串</a></li>
<li><a class="reference internal" href="#old-string-formatting">7.1.4. 格式化字串的舊方法</a></li>
</ul>
</li>
<li><a class="reference internal" href="#reading-and-writing-files">7.2. 讀寫檔案</a><ul>
<li><a class="reference internal" href="#methods-of-file-objects">7.2.1. 檔案物件的 method</a></li>
<li><a class="reference internal" href="#saving-structured-data-with-json">7.2.2. 使用 <code class="xref py py-mod docutils literal notranslate"><span class="pre">json</span></code> 儲存結構化資料</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div>
<h4>上個主題</h4>
<p class="topless"><a href="modules.html"
title="上一章"><span class="section-number">6. </span>模組 (Module)</a></p>
</div>
<div>
<h4>下個主題</h4>
<p class="topless"><a href="errors.html"
title="下一章"><span class="section-number">8. </span>錯誤和例外</a></p>
</div>
<div role="note" aria-label="source link">
<h3>此頁面</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">回報錯誤</a></li>
<li>
<a href="https://github.com/python/cpython/blob/main/Doc/tutorial/inputoutput.rst"
rel="nofollow">顯示原始碼
</a>
</li>
</ul>
</div>
</div>
<div id="sidebarbutton" title="收合側邊欄">
<span>«</span>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>瀏覽</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="總索引"
>索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模組索引"
>模組</a> |</li>
<li class="right" >
<a href="errors.html" title="8. 錯誤和例外"
>下一頁</a> |</li>
<li class="right" >
<a href="modules.html" title="6. 模組 (Module)"
>上一頁</a> |</li>
<li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> »</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.13.2 Documentation</a> »
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 教學</a> »</li>
<li class="nav-item nav-item-this"><a href=""><span class="section-number">7. </span>輸入和輸出</a></li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜尋" aria-label="快速搜尋" type="search" name="q" id="search-box" />
<input type="submit" value="前往" />
</form>
</div>
|
</li>
<li class="right">
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label> |</li>
</ul>
</div>
<div class="footer">
©
<a href="../copyright.html">
版權
</a>
2001-2025, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
See <a href="/license.html">History and License</a> for more information.<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
最後更新於 3月 15, 2025 (12:46 UTC)。
<a href="/bugs.html">Found a bug</a>?
<br />
使用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3 建立。
</div>
</body>
</html>