美文网首页程序员
跟我读python3文档:027_读写文件(7.2. Readi

跟我读python3文档:027_读写文件(7.2. Readi

作者: 咖喱py | 来源:发表于2017-09-15 17:54 被阅读141次

    贯穿始终的理念:别废话,就是干!


    往期回顾

    • 匿名函数lambda
    • 列表推导式
    • 数据结构
    • 模块

    文档解读

    python3文档第七小节链接地址:7.2. Reading and Writing Files

    本章主要讲解7.2. Reading and Writing Files(读写文件)这个小节


    作者:咖喱py

    文件读写这部分相对好理解一些,就是:

    • 打开文件 ➡️ 读文件 ➡️ 关闭文件
    • 打开文件 ➡️ 写文件 ➡️ 关闭文件

    我们把这三部分分开讲:


    第一部分:打开文件

    这一部分会略带一点读写文件的内容。

    读文件就是用读模式打开文件,用读方法读取文件;
    写文件就是用写模式打开文件,用写方法写入文件。
    关键词就是:模式、方法

    注意:读和写,是分开的两件事情!

    接下来我们来看这两件事情的异同之处。

    >>> f = open('workfile', 'w')
    
    • open( )函数打开文件,
    • 函数的第一个字符串参数代表文件,
    • 函数的第二个字符串参数代表模式,例如,常见的有如下模式字母:
    字母 模式意义
    'r' 读取文件
    'w' 写入文件,如果文件存在,则替换文件
    'a' 续写文件
    'b' 二进制模式,常与其他字母组合使用

    其他模式字母请参考文档:模式字母

    有些模式可以相互组合,比如:

    • 在模式后面加上b模式,可以进行二进制数据处理
    • 加上+(加号),代表我们可以对文件进行读

    可能+(加号)那里你有点不理解他的意思。因为你还没有明白,“读和写是两件事”是什么意思。

    我们继续往下看例子,你很快就能明白。

    写入文件:

    • 在写模式下,用写方法,即write( )方法
    >>> a = open('test.py', 'w')                  #用写模式打开文件,把文件对象赋值给a。
    >>> a.write('This is the entire file.\n')     #用write()方法写入文件
    25                                            #打印出写入的字符数量
    

    读取文件:

    • 在读模式下,用读方法,即read( )方法
    >>> b = open('test.py', 'r')                  #用读模式打开文件,把文件对象赋值给b。
    >>> b.read()                                  #用read()方法读文件
    'This is the entire file.\n'                  #文件内容被打印出来
    

    下面来体验一下什么叫做:读和写是两件事

    在读模式下,用write( )方法

    >>> c = open('test.py', 'r')                   #用读模式打开文件,把文件对象赋值给c。
    >>> c.write('galipy')                          #尝试在读模式中,写入内容。
    Traceback (most recent call last):             #程序出错
      File "<stdin>", line 1, in <module>
    io.UnsupportedOperation: not writable
    

    注意报错的最后一句话,写明了不支持写入操作。

    也就是说,我们在读模式,就只能读取文件,不能写入文件。
    在写模式,就只能写入文件,不能读取文件。

    现在明白“读和写是两件事”是什么意思了吧。
    相当于,如果你以读模式打开文件,那就只能读取文件;如果还想要写入文件,就只能用写模式再打开一遍文件。

    那么有没有什么办法可以简化一下这个步骤呢?
    答案就是:添加+(加号)模式。

    >>> c = open('test.py', 'r+')                   #用读模式与加号模式打开文件,把文件对象赋值给c。
    >>> c.write('galipy')                           #尝试在读模式中,写入内容。
    6                                               #返回写入的字符数量
    

    第二部分:读写文件

    这部分其实是讲读写文件的细节的

    我们在进行读或写操作时,一定要时刻明白自己是从哪里读,读到哪了?从哪里写,写在哪了?

    你可能会天真的理解为从头读,从头写。
    但实际情况可能和你想的不太一样。

    长者怎么说的来着?
    图样图森破~

    读文件

    #假设你有一个test.py文件,里面只写了一句话:'This is the entire file.'
    #现在我们要读取它
    
    >>> b = open('test.py', 'r')                  #用读模式打开文件,把文件对象赋值给b。
    >>> b.read()                                  #用read()方法读文件
    'This is the entire file.\n'                  #文件内容被打印出来
    
    #如果我们再次调用read()方法会怎么样?它会从哪开始读?还是从头吗?
    
    >>> b.read()
    ''
    #是不是没有得到你想要的结果?
    

    现在明白这个从哪读到底是从哪读了吗?
    当你第一次启动read( )方法时,它的确是从头开始读的,但是当你第二次调用read( )方法时,它是接着上一次调用开始读的。
    write( )方法也是一样。如果你连续调用,那么他会连续接着写。

    这样有什么好处呢?这样可以让我们一次只读取一部分,然后接着读下一部分。

    比如你有一个50G的文件,但你的电脑就2G内存,你要怎么办呢?如果你直接一次性打开,估计你的电脑就死机了。。。所以,我们需要分多次读取。

    >>> c.read(20)                      #一次读取20个字符,然后多次调用
    

    分次读取还有一些其他的方法,比如:

    c.readline()                         #一次读取一行
    

    或者

    >>> for a_line in c:                 #用循环遍历的方法一次读取一行
    ...     print(a_line, end='')
    ...
    This is the first line of the file.
    Second line of the file
    

    如果你想要读取文件中所有的行,你也可以使用 list(f) 或 f.readlines()。

    写文件

    一开始我们已经接触过写文件了,那么它有哪些需要注意的呢?

    关键点在于write( )方法的参数!
    这个参数必须是一个字符串

    也就是说,我们只能往文件里写入字符串类型!
    不能是整数类型,不能是列表类型,不能是其他任何类型!
    一定要记住write()方法的参数是字符串类型这一点,因为我们在讲解json时,还会用到这点。

    >>> a = open('test.py', 'w')                  #用写模式打开文件,把文件对象赋值给a。
    >>> a.write('This is the entire file.\n')     #用write()方法写入文件
    25                                            #打印出写入的字符数量
    

    要想写入其他类型,我们也需要先把它们转化为字符串类型在写入

    >>> value = ('the answer', 42)
    >>> s = str(value)                             #把元组类型转化为字符串类型了
    >>> f.write(s)
    18
    

    读写文件的主要细节就这些,不过还有一些拓展方法值得学习:

    • tell()方法
      查看读取到的位置
    • seek(offset, from_what)方法
      设置读取位置

    具体使用方法,请自行学习~


    第三部分:关闭文件

    为了保证文件内容的正确性,同时,为了节约内存的使用,我们每次对文件进行完操作之后都要关闭文件。

    >>> a = open('test.py', 'w')                  #用写模式打开文件,把文件对象赋值给a。
    >>> a.write('本文作者是咖喱py.\n')              #用write()方法写入文件
    11     
    >>> a.close()                                 #用close()方法关闭文件
    

    但是,一般情况下,我们的文件操作都是通过脚本文件执行的。一旦程序运行出错,我们的close()操作可能就无法执行。
    为了保证close()正确执行,于是我们就要用到try和finally两个关键字。

    注意!从现在开始,我们要写脚本文件了,不再只是在交互模式里过家家了。

    新建脚本firstFile.py
    输入如下内容:

    myfile = open('test.py','r')
    try:
      for line in myfile:              #注意缩进关系
        print(line, end='')
    finally:
      my file.close()
    

    文件会执行try语句块中的内容,不论此语句块中的内容能不能成功运行,程序最后都会去执行finally语句块中的内容。
    这样就可以保证close()这个关闭操作100%运行了。

    但是,就像我最开始那期的文章里介绍的,程序猿都是懒惰的,每次都输入那么多很麻烦。

    下面给出精简办法,用with、as关键字:

    with open('test.py','r') as myfile:
      for line in myfile:
        print(line, end='')
    

    这三行代码和上面的六行代码做的是相同的事情。只不过有些操作被隐藏了起来。
    参考着上面的try、finally语句块,试试自己理解with、as语句块发生了什么~

    by_ 咖喱py


    今天就讲到这里吧~
    记住write( )方法的参数特点哟~下期讲解json将会用到~


    最近发现文章被盗的很凶,而且还不署名。。。
    你们的良心不会痛嘛~

    相关文章

      网友评论

        本文标题:跟我读python3文档:027_读写文件(7.2. Readi

        本文链接:https://www.haomeiwen.com/subject/javjsxtx.html