文件处理part2-练习👈

作业

1、通用文件copy工具实现

"""
source_file = input('源目标地址>>').strip()
target_file = input("新目标地址>>").strip()
with open(fr'{source_file}', mode='rb') as f1,\
    open(fr'{target_file}', mode='wb') as f2:
    for line in f1:
        f2.write(line)
"""

# 优化bug:1、源文件需要判断存不存在,不然读的操作会报错。2、需要考虑使用b模式的拷贝,效率比t模式效率高。
import os

source_path = input('源文件路径>>:').strip()
if not os.path.isfile(source_path):
    print("源文件路径不存在")
else:
    target_path = input("目标文件路径>>:").strip()
    with open(rf'{source_path}', mode='rb') as f1, \
            open(rf'{target_path}', mode='wb') as f2:
        for line in f1:
            f2.write(line)
    print('拷贝文件成功'.center(50, '-'))

2、基于seek控制指针移动,测试r+、w+、a+模式下的读写内容

  • 总结
"""
注意:a模式下,无论你的文件指针在哪个位置。一旦你使用write操作,写入的内容必然要追加到文件的末尾。
1、seek默认就是0模式
2、指针使用默认不移动:0、1、2三种模式只要没有进行移动操作t、b模式中都可以使用。
3、指针移动时:0模式只能用在t模式中使用。0、1、2模式都可以用来b模式中
4、seek推荐用的模式:seek推荐使用在b模式中,一般基于seek的操作,都是用于b模式下的操作。
"""
  • 使用w模式先创建文件
a_file, b_file, c_file = [r'a.txt', r'b.txt', r'c.txt']
with open(a_file, 'w', encoding='utf-8') as f:
    f.write('abc你好')
  • r+模式练习
with open(a_file, mode='r+', encoding='utf-8') as f:
    # 读全部内容
    print(f.read())  # abc你好
    print(f'1次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 读出‘你好’
    f.seek(3, 0)
    print(f.read())  # 你好
    print(f'2次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 读出‘abc’
    f.seek(0, 0)
    print(f.read(3))  # abc
    print(f'3次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 3

    # 把‘abc’覆盖成‘ABC’
    f.seek(0, 0)
    f.write('ABC')
    f.seek(0, 0)
    print(f.read())  # ABC你好
    print(f'4次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 把‘你好’覆盖成‘你坏’
    f.seek(3, 0)
    f.write('你坏')
    f.seek(0, 0)
    print(f.read())  # ABC你坏
    print(f'5次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9
  • wb+模式练习
with open(a_file, mode='w+b') as f:
    f.write('abc你好'.encode('utf-8'))

    # 读全部
    f.seek(-9, 2)
    print(f.read().decode('utf-8'))  # abc你好
    print(f'1次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 读出‘你好’
    f.seek(-6, 2)
    print(f.read().decode('utf-8'))  # 你好
    print(f'2次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 读出‘abc’
    f.seek(0, 0)
    print(f.read(3))  # b'abc'
    print(f'3次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 3

    # 读出'c',再读出’好‘
    f.seek(0, 0)
    f.seek(2)
    print(f.read(1))  # b'c'
    print(f.tell())  # 3
    f.seek(3, 1)
    print(f.tell())  # 6
    print(f.read(3).decode('utf-8'))  # 好
    print(f'4次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 把‘c’覆盖成’C‘
    f.seek(-7, 1)
    print(f.tell())  # 2
    f.write(b'C')
    print(f.tell())  # 3
    f.seek(-3, 1)
    print(f.read().decode('utf-8'))  # abC你好
    print(f'5次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9

    # 把‘好’覆盖层’坏‘
    f.seek(-3, 2)
    f.write(bytes('坏', encoding='utf-8'))
    f.seek(0, 0)
    print(f.read().decode('utf-8'))  # abC你坏
    print(f'6次操作以后文件指针所在的字节位置为:{f.tell()}'.center(50, '-'))  # 9
  • a+模式练习
with open(a_file, mode='a+') as f:
    f.seek(0, 0)
    print(f.read(3))  # abC
    print(f.tell())  # 3
    f.write('D')  # 注意: a模式下,无论你的文件指针在哪个位置。一旦你使用write操作,写入的内容必然要追加到文件的末尾。

3、tail -f access.log程序实现

access_file = r'access.log'
"""
catch_file = r'catch.txt'

import os

if not os.path.isfile(access_file):
    with open(access_file, 'w+', encoding='utf-8') as f:
        for i in range(5):
            f.write(f'日志{i}'.center(50, '-') + '\n')
        f.seek(0, 0)
        print(f.read())

# 先进入日志文件,查看当前的文件的末尾。再进入捕获文件,对比当前文件指针的字节数与之前保存的是否一致,如果不一致调用f.tell发现字节数会增加,那么这个时候就把日志文件的文件指针位置跳到之前捕获文件保留的文件指针的位置。再执行读的操作,把日志中新增的日志内容读出来,打印到屏幕上。
with open(access_file, 'rt', encoding='utf-8') as f, \
        open(catch_file, 'rt', encoding='utf-8') as f1, \
        open('temp.txt', 'wt', encoding='utf-8') as f2:
    # seek操作让文件指针跳到文件末尾,并读取日志文件当前末尾的指针位置
    f.seek(0, 2)
    current_seat = f.tell()
    # 读取捕获文件的保存的文件指针数值
    f1.seek(0, 0)
    source_seat = f1.read()
    print(source_seat, current_seat)
    if source_seat:
        source_seat = int(source_seat)
        if current_seat > source_seat:
            # f.seek(source_seat, 0)
            f.seek(source_seat)
            print(f.read())
    f2.write(f'{current_seat}')
os.remove(catch_file)
os.rename('temp.txt', catch_file)

with open('access.log', mode='a', encoding='utf-8') as f:
    import random

    for i in range(5):
        f.write(f'日志{random.randint(0, 9)}'.center(50, '-') + '\n')
"""
# 优化(实现定时检测功能):使用b模式读取文件 + while死循环 + time.sleep实现时时检测,定时打印到屏幕:跑到access_file文件中些内容并保存以后,就可以在终端打印看到了。
import time
with open(access_file, 'rb') as f:
    f.seek(0, 2)
    while True:
        res = f.readline()
        if res:
            print(res.decode('utf-8'), end='')
        else:

            time.sleep(0.2)

4、编写用户登录接口

'''
tank:123
egon:123
alex:123
'''
"""
inp_username = input('please input your username>>:').strip()
inp_password = input('please input your password>>:').strip()
with open('user.txt', 'r', encoding='utf-8') as f:
    for line in f:
        res = line.strip()
        if not res:
            continue
        username, password = res.split(":")
        if inp_username == username and inp_password == password:
            print("登录成功!")
            break
    else:
        print('登录失败,用户名或密码错误!')
"""
# 优化:1、将用户所有的数据读入字典中(放入内存中)
user_dic = {}
with open('user.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
        res = line.strip()
        if not res:
            continue
        useranme, password = res.split(":")
        user_dic[useranme] = password
        
while True:
    inp_username = input('please input your username>>:').strip()
    # 判断用户存在
    if inp_username not in user_dic:
        print("用户不存在,重新输入")
        continue
    inp_password = input('please input your password>>:').strip()
    password = user_dic.get(inp_username)
    if inp_password == password:
        print("登录成功")
        break
    else:
        print("登录失败。")

5、编写程序实现用户注册后(注册到文件中),可以登录(登录信息来自于文件)

"""
# 登录、注册
tag = True
while tag:
    print('''
    0 登录
    1 注册
    ''')
    cmd = input('根据数字选择相应的功能>>:').strip()
    if not cmd.isdigit():
        print('输入数字')
        continue
    cmd = int(cmd)
    if cmd == 0:
        inp_username = input('please input your username>>:').strip()
        inp_password = input('please input your password>>:').strip()
        with open('user.txt', 'r', encoding='utf-8') as f:
            for line in f:
                res = line.strip()
                if not res:
                    continue
                username, password = res.split(":")
                if inp_username == username and inp_password == password:
                    print("登录成功!")
                    tag = False
                    break
            else:
                print('登录失败,用户名或密码错误!')
    elif cmd == 1:
        username = input("账户名称>>:").strip()
        if not username:
            print('用户名不能为空')
            continue

        with open('user.txt', 'r+b') as f:
            for line in f:
                res = line.decode('utf-8').strip()
                if not res:
                    continue
                name, pwd = res.split(":")
                if username == name:
                    print('用户已经存在')
                    break
            else:
                password = input("账户密码>>:").strip()
                f.seek(0, 2)
                f.write(f'{username}:{password}\n'.encode('utf-8'))
                print('注册成功!')
    else:
        print('范围超出')
"""

# 优化:1、将用户所有的数据读入字典中(放入内存中)实现功能 :注册
user_dic = {}
with open('user.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
        res = line.strip()
        if not res:
            continue
        useranme, password = res.split(":")
        user_dic[useranme] = password
while True:
    inp_username = input('please input your username>>:').strip()
    # 判断用户存在
    if inp_username in user_dic:
        print("当前用户已经存在,请重新输入")
        continue
    inp_password = input('please input your password>>:').strip()
    confirm_password = input('please confirm your password>>:').strip()
    if not inp_password:
        print("密码不能为空")
        continue

    if inp_password == confirm_password:
        print(f"恭喜【{useranme}】!注册成功".center(50, '-'))
        with open('user.txt', mode='at', encoding='utf-8') as f:
            f.write(f'{useranme}:{password}')
    else:
        print("两次密码不一致")
posted @ 2020-03-17 23:51  给你加马桶唱疏通  阅读(198)  评论(0编辑  收藏  举报