2020Python作业八——文件处理3—b模式的文件读写操作

@2020.3.16

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

#1、通用文件copy工具实现 

src_file=input('请输入源文件路径>>: ').strip()
dst_file=input('请输入副本文件保存路径>>: ').strip()
with open(r'{}'.format(src_file),mode='rb') as f1,\
    open(r'{}'.format(dst_file),mode='wb') as f2:
    for line in f1:
        f2.write(line)

 

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

 r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置

# r+
with open('user.txt',mode='r+b') as f1:
    print(f1.read())
    f1.seek(0,0)
    # f1.write('Mili')  #TypeError: a bytes-like object is required, not 'str'
    # f1.write(bytes('Mili'))  #TypeError: string argument without an encoding
    f1.write(bytes('Mili',encoding='utf-8'))#此处将前四个字符改写成Mili,此时指针在第5个字符的位置,即索引4
    print(f1.tell())
    print(f1.read()) #指针从第五个字符开始读取剩余的字符
    print(f1.tell())

b'MiliLoveYou'
4
b'LoveYou'
11

 w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置

#user.txt——MiliLoveYou
with open('user.txt',mode='w+b') as f2:
    f2.seek(0, 0)
    print(f2.read())# 此时文件里面的内容已被清空
    f2.write(bytes('CatsLoveYou',encoding='utf-8'))
    f2.seek(0, 0)
    print(f2.read())#新的内容CatsLoveYou写入之前已被清空的文件
    f2.seek(4, 0)
    print(f2.tell())#tell()得到指针的位置
    print(f2.read()) #指针从第五个字符开始读取剩余的字符
    print(f2.tell())
b
'' b'CatsLoveYou' 4 b'LoveYou' 11

 a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾

# user.txt——CatsLoveYou
with open('user.txt',mode='a+b') as f3:
    f3.seek(0, 0)
    print(f3.read())#读取原内容 CatsLoveYou

    f3.write(bytes('MiliLoveYou',encoding='utf-8'))
    f3.seek(0, 0)
    print(f3.read())#在末尾添加新内容,最后输出CatsLoveYouMiliLoveYou

    f3.seek(4, 0)
    print(f3.tell())
    print(f3.read()) #指针从第五个字符开始读取剩余的字符
    print(f3.tell())
b
'CatsLoveYouMiliLoveYou' b'CatsLoveYouMiliLoveYouMiliLoveYou' 4 b'LoveYouMiliLoveYouMiliLoveYou' 33

 

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

tag = True
while tag:
    cmd = input('请输入命令:').strip()
    if cmd == 'tail -f access.log':
        with open(r'access.log', 'a+b') as f:
            #如果指令为tail -f access.log,没有access.log文件,a模式下则会新建该文件,并将后面输入的内容写入文件中
            f.write(bytes('{}\n'.format(cmd), encoding='utf-8'))
            f.seek(0, 0)
            log = f.read().decode('utf-8')
            print(log)
        continue
    else:
        #如果指令不是tail -f access.log,则会持续要求输入命令,直到指令为tail -f access.log
        # 才会创建access.log文件,并将之前输入的所有指令(包括tail -f access.log)写入access.log
        with open(r'access.log', 'ab') as f:
            f.write(bytes('{}\n'.format(cmd), encoding='utf-8'))
#        创建日志之后,日志还在要求 输入命令,可继续输入内容


请输入命令:猫爱米粒
请输入命令:米粒爱猫
请输入命令:来日方长,未来可期
请输入命令:tail -f access.log
猫爱米粒
米粒爱猫
来日方长,未来可期
tail -f access.log

请输入命令:

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄