<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>文件读写 on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99/</link>
    <description>Recent content in 文件读写 on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 04 Sep 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://tuanzi-wow.cn/tags/%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>7. 输入和输出</title>
      <link>https://tuanzi-wow.cn/python/python-07-io/</link>
      <pubDate>Fri, 04 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/python/python-07-io/</guid>
      <description>更复杂的输出格式（f-string、str.format）与文件的读写方式。</description>
      <content:encoded><![CDATA[<h2 id="71更加复杂的输出格式">7.1.更加复杂的输出格式</h2>
<h3 id="格式化字符串字面值">格式化字符串字面值</h3>
<p>在字符串开头的引号/三引号之前加f/F
特性：可以通过{}在字符之间输入引用的变量，或者字面值的Python表达式
例子如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">year = 2016
</span></span><span class="line"><span class="cl">event = &#39;Referendum&#39;
</span></span><span class="line"><span class="cl">f&#39;Results of the {year} {event}&#39;
</span></span><span class="line"><span class="cl">&#39;Results of the 2016 Referendum&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="strformat">str.format（）:</h4>
<p>特性：1.同上，但你需要提供详细的格式化指令和待格式化的信息
例子：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">yes_votes = 42_572_654
</span></span><span class="line"><span class="cl">total_votes = 85_705_149
</span></span><span class="line"><span class="cl">percentage = yes_votes / total_votes
</span></span><span class="line"><span class="cl">&#39;{:-9} YES votes  {:2.2%}&#39;.format(yes_votes, percentage)
</span></span><span class="line"><span class="cl">&#39; 42572654 YES votes  49.67%&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>解释：
注意此处的输出
-9：&quot;-&ldquo;表示只有在复数是才显示负号，+表示总是显示正负号
例如 {&rsquo;&rsquo;:+&rsquo;&rsquo;}.format(100)  输出+100;
{&rsquo;&rsquo;:+&rsquo;&rsquo;}.format(-100)  输出-100;
{&rsquo;&rsquo;:-&rsquo;&rsquo;}.format(100)  输出100;
{&rsquo;&rsquo;:-&rsquo;&rsquo;}.format(-100)  输出-100;
&lsquo;9&rsquo;表示最小宽度，没有达到则需要填充，比如上面只有八位，在前面填充了一个空格；
{:2.2%} ：
第一个2也表示整数部分最小宽度，因达到两位所以无影响
第二个2表示小数点后保留两位；
百分号表示用%表示</p>
<h4 id="str和repr把值转化成字符串">str()和repr():把值转化成字符串</h4>
<p>不需要花哨输出，用于快速显示变量进行调试</p>
<h4 id="string-模块通过-stringtemplate-提供了一种基于正则表达式的简单模板方法支持"><a href="https://docs.python.org/zh-cn/3/library/string.html#module-string"><code>string</code></a> 模块通过 <a href="https://docs.python.org/zh-cn/3/library/string.html#string.Template"><code>string.Template</code></a> 提供了一种基于正则表达式的简单模板方法支持。</h4>
<p>这种方式为字符串中的值替换提供了另一种途径：使用类似 <code>$x</code> 的占位符，并将其替换为字典中的对应值。该语法使用简便，但在格式控制方面提供的功能较为有限。</p>
<h3 id="711格式化字符串字面值">7.1.1.格式化字符串字面值</h3>
<p>字符串前夹f或F，通过{expression}表达式，把Python变量引入字符串中
格式说明符：可选，便于更好控制格式化值的方式，写在表达式的后面
例1：将pi舍入到小数点后三维  {math.pi:.3f}
例2：再：传递整数，表示最小字符宽度，常于用列对齐
常用于格式化的修饰符及其作用：
<code>'!a'</code> 应用 <a href="https://docs.python.org/zh-cn/3/library/functions.html#ascii"><code>ascii()</code></a> ，<code>'!s'</code> 应用 <a href="https://docs.python.org/zh-cn/3/library/stdtypes.html#str"><code>str()</code></a>，<code>'!r'</code> 应用 <a href="https://docs.python.org/zh-cn/3/library/functions.html#repr"><code>repr()</code></a>：
=的作用：{expression = }将其拓展为 expression = value</p>
<h3 id="712字符串format方法">7.1.2.字符串format方法</h3>
<p>基本用法：
例1：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;We are the </span><span class="si">{}</span><span class="s1"> who say &#34;</span><span class="si">{}</span><span class="s1">!&#34;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">&#39;knights&#39;</span><span class="p">,</span> <span class="s1">&#39;Ni&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">We</span> <span class="n">are</span> <span class="n">the</span> <span class="n">knights</span> <span class="n">who</span> <span class="n">say</span> <span class="s2">&#34;Ni!&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>{}替换为传递给format方法的对象：</strong>
<strong>{}内的数字：表示传递的对象的位置</strong>，例如</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">print(&#39;{0} and {1}&#39;.format(&#39;spam&#39;, &#39;eggs&#39;))
</span></span><span class="line"><span class="cl">spam and eggs
</span></span><span class="line"><span class="cl">print(&#39;{1} and {0}&#39;.format(&#39;spam&#39;, &#39;eggs&#39;))
</span></span><span class="line"><span class="cl">eggs and spam
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>通过关键字参数名引入value</strong></p>
<p>例：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">print(&#39;This {food} is {adjective}.&#39;.format(
</span></span><span class="line"><span class="cl">      food=&#39;spam&#39;, adjective=&#39;absolutely horrible&#39;))
</span></span><span class="line"><span class="cl">This spam is absolutely horrible.
</span></span></code></pre></td></tr></table>
</div>
</div><p>关键词参数和位置参数可以组合使用，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">print(&#39;The story of {0}, {1}, and {other}.&#39;.format(&#39;Bill&#39;, &#39;Manfred&#39;,
</span></span><span class="line"><span class="cl">                                                   other=&#39;Georg&#39;))
</span></span><span class="line"><span class="cl">The story of Bill, Manfred, and Georg.
</span></span></code></pre></td></tr></table>
</div>
</div><p>按名称引入变量进行格式化。可以通过字典传递，使用[]进行访问
例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">table = {&#39;Sjoerd&#39;: 4127, &#39;Jack&#39;: 4098, &#39;Dcab&#39;: 8637678}
</span></span><span class="line"><span class="cl">print(&#39;Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; &#39;
</span></span><span class="line"><span class="cl">      &#39;Dcab: {0[Dcab]:d}&#39;.format(table))
</span></span><span class="line"><span class="cl">Jack: 4098; Sjoerd: 4127; Dcab: 8637678
</span></span></code></pre></td></tr></table>
</div>
</div><p>详解：此处的{0[Jack]:d}中参数的含义 0表示第零个参数，即table这个字典，Jack为关键字参数不必多说，：d表示demical，用十进制表示，绝非double
除此之外，此处的table还可以通过**作为参数，此时就不需要通过[]来访问了
例如</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">print(&#39;Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}&#39;.format(**table))
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="713手动格式化字符串">7.1.3.手动格式化字符串</h3>
<p>蠢蠢的，自己看</p>
<h3 id="714旧式字符串格式化方法">7.1.4.旧式字符串格式化方法</h3>
<p>%用于字符串插值，感觉也蠢蠢的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import math
</span></span><span class="line"><span class="cl">print(&#39;The value of pi is approximately %5.3f.&#39; % math.pi)
</span></span><span class="line"><span class="cl">The value of pi is approximately 3.142.
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="72读写文件">7.2.读写文件</h2>
<p>open（）的应用：
返回值：一个file object，参数open（filename,mode,encoding = none）
各个参数的意义：
filename：文件名字符串
mode：描述对文件的操作，包含以下几种值：
r：read only，表示只读	w：表示只写	a：表示打开文件并追加内容，将写入的数据写入文件末尾	r+：进行读写	默认值为r
encoding:选择的编码，一般默认UTF-8；在模式后面加b，可以使用binary mode打开文件，二级制数据以bytes对象形式进行读写的，该情况不允许指定encoding
而默认情况是以text mode打开
读取文件，会把平台特定的行终结符统一转化为\n，而写入时，又会转化为平台对应的终结符
但是该操作会破坏二级制文件中的数据，这类数据只能通过二级制模式读写</p>
<p>with关键字：优点：字句结束后，文件会正确关闭，且代码更简洁</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">with open(&#39;workfile&#39;, encoding=&#34;utf-8&#34;) as f:
</span></span><span class="line"><span class="cl">    read_data = f.read()
</span></span></code></pre></td></tr></table>
</div>
</div><p>没有with关键字，应通过f.close()关闭文件，释放资源，
若未使用close()关闭文件或者with关键字，可能导致写入的参数未写入磁盘</p>
<h3 id="721文件对象的方法">7.2.1.文件对象的方法</h3>
<p>前提：已创建f文件对象
<strong>f.read(size)：用于读取文件内容</strong>
返回值：字符串（文本模式），字节串（二进制模式）
size：可选。默认值或复数：读取整个文件内容；其他值：读取size个字符或者size个字节
到达文件末尾返回空字符串’ ‘
<strong>f.readline():从文件中读取单行字符串</strong>
保留换行符’\n&rsquo;,例如</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">f.readline()
</span></span><span class="line"><span class="cl">&#39;This is the first line of the file.\n&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>只有在文件不以换行符结尾才省略换行符
<strong>若需要读取多行，通过循环遍历整个文件对象：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">for line in f:
</span></span><span class="line"><span class="cl">    print(line, end=&#39;&#39;)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">This is the first line of the file.
</span></span><span class="line"><span class="cl">Second line of the file
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果需要以列表形式读取，则可以用list(f)或者f.readline()
<strong>f.write(string):把string内容写入文件并返回写入的字符数</strong>
写入其他类型时，要先做类型转化，转化为string或者bytes</p>
<p><strong>f.seek(offset,whence)改变文件对象的位置</strong>
通过参考点添加offset计算位置
参考点有whence指定：0：从文件开头；1：使用当前文件位置；2：使用文件末尾
默认值为0
可以和f.tell()搭配使用
在文本文件（模式字符串未使用 <code>b</code> 时打开的文件）中，只允许相对于文件开头搜索（使用 <code>seek(0, 2)</code> 搜索到文件末尾是个例外），唯一有效的 <em>offset</em> 值是能从 <code>f.tell()</code> 中返回的，或 0。其他 <em>offset</em> 值都会产生未定义的行为。</p>
<h3 id="722-使用-json-保存结构化数据">7.2.2. 使用 <a href="https://docs.python.org/zh-cn/3/library/json.html#module-json"><code>json</code></a> 保存结构化数据<a href="https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#saving-structured-data-with-json">¶</a></h3>
<p>字符串可以很容易地写入文件或从文件中读取。 数字则更麻烦一些，因为 <a href="https://docs.python.org/zh-cn/3/library/io.html#io.TextIOBase.read"><code>read()</code></a> 方法只返回字符串，而字符串必须传给 <a href="https://docs.python.org/zh-cn/3/library/functions.html#int"><code>int()</code></a> 这样的函数，它接受 <code>'123'</code> 这样的字符串并返回其数值 123。 当你想要保存嵌套列表和字典等更复杂的数据类型时，手动执行解析和序列化操作将会变得非常复杂。</p>
<p>Python 允许你使用流行的数据交换格式 <a href="https://json.org/">JSON (JavaScript Object Notation)</a>，而不是让用户持续编写和调试代码来将复杂的数据类型存入文件中。 标准库模块 <a href="https://docs.python.org/zh-cn/3/library/json.html#module-json"><code>json</code></a> 可以接受带有层级结构的 Python 数据，并将其转换为字符串表示形式；这个过程称为 <em>serializing</em>。 根据字符串表示形式JSON重建数据则称为 <em>deserializing</em>。 在序列化和反序列化之间，用于代表对象的字符串可以存储在文件或数据库中，或者通过网络连接发送到远端主机。</p>
<p>备注</p>
<p>JSON 格式通常用于现代应用程序的数据交换。程序员早已对它耳熟能详，可谓是交互操作的不二之选。</p>
<p>只需一行简单的代码即可查看某个对象的 JSON 字符串表现形式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import json
</span></span><span class="line"><span class="cl">x = [1, &#39;simple&#39;, &#39;list&#39;]
</span></span><span class="line"><span class="cl">json.dumps(x)
</span></span><span class="line"><span class="cl">&#39;[1, &#34;simple&#34;, &#34;list&#34;]&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p><a href="https://docs.python.org/zh-cn/3/library/json.html#json.dumps"><code>dumps()</code></a> 函数还有一个变体， <a href="https://docs.python.org/zh-cn/3/library/json.html#json.dump"><code>dump()</code></a> ，它只将对象序列化为 <a href="https://docs.python.org/zh-cn/3/glossary.html#term-text-file">text file</a> 。因此，如果 <code>f</code> 是 text file 对象，可以这样做：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">json.dump(x, f)
</span></span></code></pre></td></tr></table>
</div>
</div><p>要再次解码对象，如果 <code>f</code> 是已打开、供读取的 <a href="https://docs.python.org/zh-cn/3/glossary.html#term-binary-file">binary file</a> 或 <a href="https://docs.python.org/zh-cn/3/glossary.html#term-text-file">text file</a> 对象：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><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>
</span></span></code></pre></td></tr></table>
</div>
</div><p>备注</p>
<p>JSON 文件必须以 UTF-8 编码。当打开 JSON 文件作为一个 <a href="https://docs.python.org/zh-cn/3/glossary.html#term-text-file">text file</a> 用于读写时，使用 <code>encoding=&quot;utf-8&quot;</code> 。</p>
<p>这种简单的序列化技术可以处理列表和字典，但在 JSON 中序列化任意类的实例，则需要付出额外努力。<a href="https://docs.python.org/zh-cn/3/library/json.html#module-json"><code>json</code></a> 模块的参考包含对此的解释。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
