第九天 光标控制与函数

文件指针移动

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

f.read(3)

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

    data=f.read(3)

    print(data)

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

    data=f.read(3)

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

扫描二维码关注公众号,回复: 3270788 查看本文章

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'))

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

    f.seek(5,0)

    print(f.read())

1模式详解

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

    f.seek(3,1)#停留在三后面

    print(f.tell())

    f.seek(4,1)#3+4=7光标在第七个字节后

    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'))

tail -f access.log

with open('access.log',mode='rb') as f:

    f.seek(0,2)

    while True:

        line=f.readline()

        if len(line) == 0:

            # 没有内容

            continue

        else:

            print(line.decode('utf-8'),end='')

须知一:

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

内存控制可以修改

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,...)

 

 

'''

 

def login():

    uname=input('请输入用户名>>: ').strip()

    pwd=input('password>>: ').strip()

    if uname == 'egon' and pwd == '123':

        print('login successfull')

        return True

    else:

        print('user or password error')

        return False

 

def max2(x,y):

    # x=10

     # y=20

     if x > y:

         return x

     else:

         return y

 

 res=max2(3.1,2.3)

 print(res*12)

 

 

 

 

 

作业 !!!

 购物车

 1. 注册

 2. 登陆

 3. 购物

 4. 支付

 5. 充值

 

while True:

    print("""

    0. 退出

    1. 注册

    2. 登陆

    3. 购物

    4. 支付

    5. 充值

    """)

    choice=input('>>>: ').strip()

    if choice == '0':break

    if choice == '1':

        register()

    elif choice == '2':

        login()

    ....

猜你喜欢

转载自www.cnblogs.com/gongcheng-/p/9686830.html
今日推荐