590 lines
64 KiB
HTML
590 lines
64 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||
|
||
<title>7. 输入与输出 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||
|
||
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
||
<script src="../_static/jquery.js"></script>
|
||
<script src="../_static/underscore.js"></script>
|
||
<script src="../_static/doctools.js"></script>
|
||
<script src="../_static/language_data.js"></script>
|
||
<script src="../_static/translations.js"></script>
|
||
|
||
<script src="../_static/sidebar.js"></script>
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml"
|
||
title="在 Python 3.8.20 文档 中搜索"
|
||
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. 模块" 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="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>
|
||
|
||
</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" />
|
||
<label for="menuToggler" class="toggler__label">
|
||
<span></span>
|
||
</label>
|
||
<nav class="nav-content" role="navigation">
|
||
<a href="https://www.python.org/" class="nav-logo">
|
||
<img src="../_static/py.svg" alt="Logo"/>
|
||
</a>
|
||
<div class="version_switcher_placeholder"></div>
|
||
<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"
|
||
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" fill="#444"></path>
|
||
</svg>
|
||
<input type="text" name="q" aria-label="快速搜索"/>
|
||
<input type="submit" value="转向"/>
|
||
</form>
|
||
</nav>
|
||
<div class="menu-wrapper">
|
||
<nav class="menu" role="navigation" aria-label="main navigation">
|
||
<div class="language_switcher_placeholder"></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. 格式化字符串字面值</a></li>
|
||
<li><a class="reference internal" href="#the-string-format-method">7.1.2. 字符串 format() 方法</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. 文件对象的方法</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>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="modules.html"
|
||
title="上一章"><span class="section-number">6. </span>模块</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="errors.html"
|
||
title="下一章"><span class="section-number">8. </span>错误和异常</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/tutorial/inputoutput.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
||
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
||
你应当升级版本,并阅读
|
||
<a href="/3/tutorial/inputoutput.html"> Python 当前稳定版本的文档</a>.
|
||
</div>
|
||
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<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. 模块"
|
||
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.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Python 教程</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="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</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>表达式语句</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> 函数。第三种方法是使用文件对象的 <code class="xref py py-meth docutils literal notranslate"><span class="pre">write()</span></code> 方法;标准输出文件称为 <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">格式化字符串字面值</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 表达式。</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> 方法需要更多手动操作。该方法也用 <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">no_votes</span> <span class="o">=</span> <span class="mi">43_132_495</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="p">(</span><span class="n">yes_votes</span> <span class="o">+</span> <span class="n">no_votes</span><span class="p">)</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>
|
||
</li>
|
||
<li><p>最后,还可以用字符串切片和合并操作完成字符串处理操作,创建任何排版布局。字符串类型还支持将字符串按给定列宽进行填充,这些方法也很有用。</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> 相同的值。一般情况下,数字、列表或字典等结构的值,使用这两个函数输出的表现形式是一样的。字符串有两种不同的表现形式。</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> 类,提供了将值替换为字符串的另一种方法。该类使用 <code class="docutils literal notranslate"><span class="pre">$x</span></code> 占位符,并用字典的值进行替换,但对格式控制的支持比较有限。</p>
|
||
<section id="formatted-string-literals">
|
||
<span id="tut-f-strings"></span><h3><span class="section-number">7.1.1. </span>格式化字符串字面值<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>格式说明符是可选的,写在表达式后面,可以更好地控制格式化值的方式。下例将 pi 舍入到小数点后三位:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</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>格式规范参考详见参考指南 <a class="reference internal" href="../library/string.html#formatspec"><span class="std std-ref">格式规格迷你语言</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() 方法<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> 方法的基本用法如下所示:</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> 方法的对象。花括号中的数字表示传递给 <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> 方法的对象所在的位置。</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> 方法中使用关键字参数名引用值。</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="go"> other='Georg'))</span>
|
||
<span class="go">The story of Bill, Manfred, and Georg.</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">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>也可以用 '**' 符号,把 table 当作传递的关键字参数。</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> 结合使用时,这种方式非常实用,可以返回包含所有局部变量的字典。</p>
|
||
<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"># Note use of 'end' on previous line</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> 方法通过在左侧填充空格,对给定宽度字段中的字符串进行右对齐。同类方法还有 <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> 。这些方法不写入任何内容,只返回一个新字符串,如果输入的字符串太长,它们不会截断字符串,而是原样返回;虽然这种方式会弄乱列布局,但也比另一种方法好,后者在显示值时可能不准确(如果真的想截断字符串,可以使用 <code class="docutils literal notranslate"><span class="pre">x.ljust(n)[:n]</span></code> 这样的切片操作 。)</p>
|
||
<p>另一种方法是 <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>% 运算符(求余符)也可用于字符串格式化。给定 <code class="docutils literal notranslate"><span class="pre">'string'</span> <span class="pre">%</span> <span class="pre">values</span></code>,则 <code class="docutils literal notranslate"><span class="pre">string</span></code> 中的 <code class="docutils literal notranslate"><span class="pre">%</span></code> 实例会以零个或多个 <code class="docutils literal notranslate"><span class="pre">values</span></code> 元素替换。此操作被称为字符串插值。例如:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</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 风格的字符串格式化</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-0"><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></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>
|
||
</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> 打开的,这意味着从文件中读取或写入字符串时,都会以指定的编码方式进行编码。如果未指定编码格式,默认值与平台相关 (参见 <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>)。在mode 中追加的 <code class="docutils literal notranslate"><span class="pre">'b'</span></code> 则以 <em class="dfn">binary mode</em> 打开文件:现在数据是以字节对象的形式进行读写的。这个模式应该用于所有不包含文本的文件。</p>
|
||
<p>在文本模式下读取文件时,默认把平台特定的行结束符(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="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"># We can check that the file has been automatically closed.</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>,即使程序正常退出,也**可能** 导致 <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>文件对象的方法<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> 取其他值时,读取并返回最多 <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>如需以列表形式读取文件中的所有行,可以用 <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"># convert the tuple to string</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"># Go to the 6th byte in the file</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"># Go to the 3rd byte before the end</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> 搜索到文件末尾是个例外),唯一有效的 <em>offset</em> 值是能从 <code class="docutils literal notranslate"><span class="pre">f.tell()</span></code> 中返回的,或 0。其他 <em>offset</em> 值都会产生未定义的行为。</p>
|
||
<p>文件对象还支持 <code class="xref py py-meth docutils literal notranslate"><span class="pre">isatty()</span></code> 和 <code class="xref py py-meth docutils literal notranslate"><span class="pre">truncate()</span></code> 等方法,但不常用;文件对象的完整指南详见库参考。</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-1">从文件写入或读取字符串很简单,数字则稍显麻烦,因为 <code class="xref py py-meth docutils literal notranslate"><span class="pre">read()</span></code> 方法只返回字符串,这些字符串必须传递给 <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。保存嵌套列表、字典等复杂数据类型时,手动解析和序列化的操作非常复杂。</p>
|
||
<p>Python 支持 <a class="reference external" href="http://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 格式通常用于现代应用程序的数据交换。程序员早已对它耳熟能详,可谓是交互操作的不二之选。</p>
|
||
</div>
|
||
<p>只需一行简单的代码即可查看某个对象的 JSON 字符串表现形式:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">json</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="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="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-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>
|
||
<p>这种简单的序列化技术可以处理列表和字典,但在 JSON 中序列化任意类的实例,则需要付出额外努力。<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> - 封存模块</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>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<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. 格式化字符串字面值</a></li>
|
||
<li><a class="reference internal" href="#the-string-format-method">7.1.2. 字符串 format() 方法</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. 文件对象的方法</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>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="modules.html"
|
||
title="上一章"><span class="section-number">6. </span>模块</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="errors.html"
|
||
title="下一章"><span class="section-number">8. </span>错误和异常</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/tutorial/inputoutput.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<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. 模块"
|
||
>上一页</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.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 教程</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="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="footer">
|
||
© <a href="../copyright.html">版权所有</a> 2001-2024, 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 />
|
||
|
||
<br />
|
||
|
||
The Python Software Foundation is a non-profit corporation.
|
||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
||
<br />
|
||
<br />
|
||
|
||
最后更新于 12月 09, 2024.
|
||
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
||
<br />
|
||
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
||
</div>
|
||
|
||
</body>
|
||
</html> |