文件内指针移动、文件修改和函数

  文件内指针移动、文件修改和函数。

  一、文件内指针移动

    大前提:文件内指针的移动是Bytes为单位的,唯独t模式下的read读取内容个数是以字符为单位

    例:

      with open('a.txt',mode='r',encoding='utf-8') as f:

        data=f.read(3)  #在utf-8中,三个字节代表一个数字,一个字节代表英文字母

        print(data)

      

      with open('a.txt',mode='rb') as f:

        data = f.read(3)

        print(data.decode(utf-8))

 

    f.seek(指针移动的字节数,模式控制):控制文件指针的移动

    模式控制:

    0:默认的模式,该模式代表指针移动的字节数是以文件开头为参照的

    1:该模式代表指针移动的字节数是以当前所在的位置为参照的

    2:该模式代表指针移动的字节数是以文件末尾的位置为参照的

    强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

 

    f.tell()查看文件指针当前距离文件开头的位置

 

    0模式详解

    with open('a.txt',mode='rt',encoding='utf-8') as f:

      f.seek(4,0)

      print(f.tell())

      print(f.read())

 

    with open('a.txt',mode = 'rb') as f:

      f.seek(2,0)

      print(f.tell())

      print(f.read().decode('utf-8'))

 

    1模式详解

    with open('a.txt',mode='rb') as f:

      f.seek(3,1)

      print(f.tell())

      f.seek(4,1)

      print(f.tell())

      print(f.read().decode('utf-8'))

    2模式详解

    with open('a.txt',mode='rb') as f:

      f.seek(-9,2)

      data=f.read()

      print(data.decode('utf-8'))

 

  二、文件修改

    须知一:

    硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容

    内容控制可以修改

    with open('a.txt','r+t',encoding='utf-8') as f:

      f.seek(4,0)

      print(f.tell())

      f.write('我擦勒')

 

    须知二:

    文件对应的是硬盘空间,硬盘不能修改所以文件本质也不能修改,

    我们看到文件的内容可以修改,是如何实现的呢?

    大的思路:将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖写回原文件

    具体的实现方式分为两种:

    1.将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件

    优点:在文件修改过程中同一份数据只有一份

    缺点:会过多地占用内存

    with open('db.txt',mode='rt',encoding='utf-8') as f:

      data = f.read()

    

    with open('db.txt',mode='wt',encoding = 'utf-8') as f:

      f.write(data.replace('kevin','SB'))

    2.以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名

    优点:不会占用过多的内存

    缺点:在文件修改过程中同一份数据存了两份

 

    import os

    with open('db.txt',mode='rt',encoding='utf-8') as read_f,\

        open('.db.txt.swap',mode = 'wt',encoding = 'utf-8') as wrife_f:

      for line in read_f:

        wrife_f.write(line.replace('SB','kevin'))

    os.remove('db.txt')

    os.rename('.db.txt.swap','db.txt')

  三、函数

   (1) 什么是函数

      具备某一功能的工具->函数

      事先准备工具的过程---->函数的定义

      遇到应用场景,拿来就用----->函数的调用

      

      函数分类两大类:

        1、内置函数

        2、自定义函数

    (2)为何要用函数

        1、代码冗余

        2、可读性差

        3、可扩展性差

 

    (3)如何用函数

        原则:必须先定义,再调用

 

        定义函数的语法:

          def 函数名(参数1,参数2,......)

            """文档注释"""

            code1

            code2

            code3

            .....

            return 返回值

        调用函数的语法:

            函数名(值1,值2)      

  

    

        

posted @ 2018-09-21 20:30  小菜鸟张阳阳  阅读(638)  评论(0编辑  收藏  举报