Python全栈之路系列之文件操作

skymysky 8年前
   <p>Python可以对文件进行查看、创建等功能,可以对文件内容进行添加、修改、删除,且所使用到的函数在Python3.5.x为 open ,在Python2.7.x同时支持 file 和 open ,但是在3.5.x系列移除了 file 函数。</p>    <h2>Python文件打开方式</h2>    <pre>  <code class="language-python">文件句柄 = open('文件路径','打开模式')</code></pre>    <p>Ps:文件句柄相当于于变量名,文件路径可以写为绝对路径也可以写为相对路径。</p>    <h2>Python打开文件的模式</h2>    <p>基本的模式</p>    <table>     <thead>      <tr>       <th>模式</th>       <th>说明</th>       <th>注意事项</th>      </tr>     </thead>     <tbody>      <tr>       <td>r</td>       <td>只读模式</td>       <td>文件必须存在</td>      </tr>      <tr>       <td>w</td>       <td>只写模式</td>       <td>文件不存在则创建文件,文件存在则清空文件内容</td>      </tr>      <tr>       <td>x</td>       <td>只写模式</td>       <td>文件不可读,文件不存在则创建,存在则报错</td>      </tr>      <tr>       <td>a</td>       <td>追加模式</td>       <td>文件不存在创建文件,文件存在则在文件末尾添加内容</td>      </tr>     </tbody>    </table>    <p>带 + 的模式</p>    <table>     <thead>      <tr>       <th>模式</th>       <th>说明</th>      </tr>     </thead>     <tbody>      <tr>       <td>r+</td>       <td>读写</td>      </tr>      <tr>       <td>w+</td>       <td>写读</td>      </tr>      <tr>       <td>x+</td>       <td>写读</td>      </tr>      <tr>       <td>a+</td>       <td>写读</td>      </tr>     </tbody>    </table>    <p>带 b 的模式</p>    <table>     <thead>      <tr>       <th>模式</th>       <th>说明</th>      </tr>     </thead>     <tbody>      <tr>       <td>rb</td>       <td>二进制读模式</td>      </tr>      <tr>       <td>wb</td>       <td>二进制写模式</td>      </tr>      <tr>       <td>xb</td>       <td>二进制只写模式</td>      </tr>      <tr>       <td>ab</td>       <td>二进制追加模式</td>      </tr>     </tbody>    </table>    <p>提示:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型</p>    <p>带 + 带 b 的模式</p>    <table>     <thead>      <tr>       <th>模式</th>       <th>说明</th>      </tr>     </thead>     <tbody>      <tr>       <td>rb+</td>       <td>二进制读写模式</td>      </tr>      <tr>       <td>wb+</td>       <td>二进制读写模式</td>      </tr>      <tr>       <td>xb+</td>       <td>二进制只写模式</td>      </tr>      <tr>       <td>ab+</td>       <td>二进制读写模式</td>      </tr>     </tbody>    </table>    <h2>Python文件读取方式</h2>    <table>     <thead>      <tr>       <th>模式</th>       <th>说明</th>      </tr>     </thead>     <tbody>      <tr>       <td>read([size])</td>       <td>读取文件全部内容,如果设置了size,那么久读取size字节</td>      </tr>      <tr>       <td>readline([size])</td>       <td>一行一行的读取</td>      </tr>      <tr>       <td>readlines()</td>       <td>读取到的每一行内容作为列表中的一个元素</td>      </tr>     </tbody>    </table>    <p>测试的文件名是 hello.tx" ,文件内容为:</p>    <pre>  <code class="language-python">Hello Word!  123  abc  456  abc  789  abc</code></pre>    <p>read</p>    <p>代码:</p>    <pre>  <code class="language-python"># 以只读的方式打开文件hello.txt  f = open("hello.txt","r")  # 读取文件内容赋值给变量c  c = f.read()  # 关闭文件  f.close()  # 输出c的值  print(c)</code></pre>    <p>输出结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  Hello Word!  123  abc  456  abc  789  abc</code></pre>    <p>readline</p>    <p>代码:</p>    <pre>  <code class="language-python"># 以只读模式打开文件hello.txt  f = open("hello.txt","r")  # 读取第一行  c1 = f.readline()  # 读取第二行  c2 = f.readline()  # 读取第三行  c3 = f.readline()  # 关闭文件  f.close()  # 输出读取文件第一行内容  print(c1)  # 输出读取文件第二行内容  print(c2)  # 输出读取文件第三行内容  print(c3)</code></pre>    <p>输出结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  Hello Word!    123    abc</code></pre>    <p>readlines</p>    <pre>  <code class="language-python"># 以只读的方式打开文件hello.txt  f = open("hello.txt","r")  # 将文件所有内容赋值给c  c = f.readlines()  # 查看数据类型  print(type(c))  # 关闭文件  f.close()  # 遍历输出文件内容  for n in c:      print(n)</code></pre>    <p>结果</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  # 输出的数据类型  <class 'list'>  Hello Word!    123    abc    456    abc    789    abc</code></pre>    <h2>Python文件写入方式</h2>    <table>     <thead>      <tr>       <th>方法</th>       <th>说明</th>      </tr>     </thead>     <tbody>      <tr>       <td>write(str)</td>       <td>将字符串写入文件</td>      </tr>      <tr>       <td>writelines(sequence or strings)</td>       <td>写多行到文件,参数可以是一个可迭代的对象,列表、元组等</td>      </tr>     </tbody>    </table>    <p>write</p>    <p>代码:</p>    <pre>  <code class="language-python"># 以只读的模式打开文件write.txt,没有则创建,有则覆盖内容  file = open("write.txt","w")  # 在文件内容中写入字符串test write  file.write("test write")  # 关闭文件  file.close()</code></pre>    <p>write.txt 文件内容为:</p>    <pre>  <code class="language-python">test write</code></pre>    <p>writelines</p>    <p>代码:</p>    <pre>  <code class="language-python"># 以只读模式打开一个不存在的文件wr_lines.txt  f = open("wr_lines.txt","w",encoding="utf-8")  # 写入一个列表  f.writelines(["11","22","33"])  # 关闭文件  f.close()</code></pre>    <p>wr_lines.txt 文件内容:</p>    <h2>Python文件操作所提供的方法</h2>    <p>close(self):</p>    <p>关闭已经打开的文件</p>    <pre>  <code class="language-python">f.close()</code></pre>    <p>fileno(self):</p>    <p>文件描述符</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  ret = f.fileno()  f.close()  print(ret)</code></pre>    <p>执行结果:</p>    <p>flush(self):</p>    <p>刷新缓冲区的内容到硬盘中</p>    <pre>  <code class="language-python">f.flush()</code></pre>    <p>isatty(self):</p>    <p>判断文件是否是tty设备,如果是tty设备则返回 True ,否则返回 False</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  ret = f.isatty()  f.close()  print(ret)</code></pre>    <p>返回结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  False</code></pre>    <p>readable(self):</p>    <p>是否可读,如果可读返回 True ,否则返回 False</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  ret = f.readable()  f.close()  print(ret)</code></pre>    <p>返回结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  True</code></pre>    <p>readline(self, limit=-1):</p>    <p>每次仅读取一行数据</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  print(f.readline())  print(f.readline())  f.close()</code></pre>    <p>返回结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  Hello Word!    123</code></pre>    <p>readlines(self, hint=-1):</p>    <p>把每一行内容当作列表中的一个元素</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  print(f.readlines())  f.close()</code></pre>    <p>返回结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  ['Hello Word!\n', '123\n', 'abc\n', '456\n', 'abc\n', '789\n', 'abc']</code></pre>    <ul>     <li> <p>tell(self):</p> </li>    </ul>    <p>获取指针位置</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  print(f.tell())  f.close()</code></pre>    <p>返回结果:</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  0</code></pre>    <p>seek(self, offset, whence=io.SEEK_SET):</p>    <p>指定文件中指针位置</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  print(f.tell())  f.seek(3)  print(f.tell())  f.close()</code></pre>    <p>执行结果</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  0  3</code></pre>    <p>seekable(self):</p>    <p>指针是否可操作</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  print(f.seekable())  f.close()</code></pre>    <p>执行结果</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  True</code></pre>    <p>writable(self):</p>    <p>是否可写</p>    <pre>  <code class="language-python">f = open("hello.txt","r")  print(f.writable())  f.close()</code></pre>    <p>执行结果</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  False</code></pre>    <p>writelines(self, lines):</p>    <p>写入文件的字符串序列,序列可以是任何迭代的对象字符串生产,通常是一个 字符串列表 。</p>    <pre>  <code class="language-python">f = open("wr_lines.txt","w")  f.writelines(["11","22","33"])  f.close()</code></pre>    <p>执行结果</p>    <p>read(self, n=None):</p>    <p>读取指定字节数据,后面不加参数默认读取全部</p>    <pre>  <code class="language-python">f = open("wr_lines.txt","r")  print(f.read(3))  f.seek(0)  print(f.read())  f.close()</code></pre>    <p>执行结果</p>    <pre>  <code class="language-python">C:\Python35\python.exe F:/Python_code/sublime/Day06/file.py  112  112233</code></pre>    <p>write(self, s):</p>    <p>往文件里面写内容</p>    <pre>  <code class="language-python">f = open("wr_lines.txt","w")  f.write("abcabcabc")  f.close()</code></pre>    <p>文件内容</p>    <pre>  <code class="language-python">abcabcabc</code></pre>    <h2>同时打开多个文件</h2>    <p>为了避免打开文件后忘记关闭,可以通过管理上下文,即:</p>    <pre>  <code class="language-python">with open('log','r') as f:   代码块</code></pre>    <p>如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。</p>    <p>在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:</p>    <pre>  <code class="language-python">with open('log1') as obj1, open('log2') as obj2:      pass</code></pre>    <p><a href="/misc/goto?guid=4959735939091507478" rel="nofollow,noindex">原文链接</a></p>    <p> </p>