博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第3章 Python基础-文件操作&函数 文件操作 练习题
阅读量:6825 次
发布时间:2019-06-26

本文共 4625 字,大约阅读时间需要 15 分钟。

一.利用b模式,编写一个cp工具,要求如下:

  1. 既可以拷贝文本又可以拷贝视频,图片等文件

  2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file

  提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数

#!/usr/bin/env python3# -*- coding:utf-8 -*-# cp工具import sysif len(sys.argv) != 3:    print("usage: cp source_file target_file")    sys.exit()else:    source_file, target_file = sys.argv[1], sys.argv[2]    with open(source_file,"rb") as read_f,open(target_file,"wb") as write_f:        for line in read_f:            write_f.write(line)

二.Python实现 tail -f 功能

#!/usr/bin/env python3# -*- coding:utf-8 -*-#tail -f工具import sys,timeif len(sys.argv) != 2:    print("usage: tail file_name")    sys.exit()else:    file_name = sys.argv[1]    with open(file_name,'rb') as f:        f.seek(0,2) # 每次都从文件末尾开始读        while True:            line = f.readline()            if line:                print(line.decode('utf-8'),end='') # 读取的每一行都去掉行尾的换行符            time.sleep(1)

有待优化,每次打开应该显示最后10行。

三.文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import oswith open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:    data=read_f.read() #全部读入内存,如果文件很大,会很卡    data=data.replace('alex','SB') #在内存中完成修改    write_f.write(data) #一次性写入新文件os.remove('a.txt')os.rename('.a.txt.swap','a.txt')

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import oswith open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:    for line in read_f:        line=line.replace('alex','SB')        write_f.write(line)os.remove('a.txt')os.rename('.a.txt.swap','a.txt')

三.全局替换程序:

  • 写一个脚本,允许用户按以下方式执行时,即可以对指定文件内容进行全局替换

  •  替换完毕后打印替换了多少处内容
#!/usr/bin/env python3# -*- coding:utf-8 -*-import sysimport osif len(sys.argv) != 4:    print("usage: python3 replace old_str new_str filename")    sys.exit()else:    old_str = sys.argv[1]    new_str = sys.argv[2]    filename = sys.argv[3]    filename_swap = sys.argv[3] + ".swap"    with open(filename,"r",encoding="utf-8") as read_f,open(filename_swap,"w",encoding="utf-8") as write_f:        count = 0        for line in read_f:            line = line.replace(old_str,new_str)            write_f.write(line)            num = line.count(new_str)            count += 1            totle = count * num        print("一共替换了%s处内容" % totle)    os.remove(filename)    os.rename(filename_swap,filename)

四.模拟登陆:

  • 用户输入帐号密码进行登陆
  • 用户信息保存在文件内
  • 用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了

user_list.txt

wss:123:1alex:456:1jay:789:1
#!/usr/bin/env python3# -*- encoding: utf8 -*-import getpassimport osuser_dict = {}with open("user_list.txt", "r", encoding="utf-8") as user_list_flie:    for line in user_list_flie.readlines():        user_list = line.strip().split(":")        # print(user_list)        _user = user_list[0].strip()        _pwd = user_list[1].strip()        _lockaccount = int(user_list[2].strip())        user_dict[_user] = {"user": _user, "pwd": _pwd, "lockaccount": _lockaccount}        # print(user_dict[_username])        # print(user_dict)exit_flag = Falsecount = 0while count < 3 and not exit_flag:    user = input('\n请输入用户名:')    if user not in user_dict:        count += 1        print("\n用户名错误")    elif user_dict[user]["lockaccount"] > 0:        print("\n用户已被锁定,请联系管理员解锁后重新尝试")        break    else:        while count < 3 and not exit_flag:            pwd = getpass.getpass('\n请输入密码:')            # pwd = input('\n请输入密码:')            if pwd == user_dict[user]["pwd"]:                print('\n欢迎登陆')                print('..........')                exit_flag = True            else:                count += 1                print('\n密码错误')                continue    if count >= 3:  # 尝试次数大于等于3时锁定用户        if user == "":            print("\n您输入的错误次数过多,且用户为空")        elif user not in user_dict:            print("\n您输入的错误次数过多,且用户 %s 不存在" % user)        else:            user_dict[user]["lockaccount"] += 1            # print(user_dict[user]["lockaccount"])            with open("user_list.txt", "r", encoding="utf-8") as user_list_file, open("use_list.txt.swap", "w",encoding="utf-8") as new_user_list_file:                for new_line in user_dict:                    new_user_list = [str(user_dict[new_line]["user"]), str(user_dict[new_line]["pwd"]),                                     str(user_dict[new_line]["lockaccount"])]                    # print(new_user_list)                    user_str = ":".join(new_user_list)                    print(user_str)                    new_user_list_file.write(user_str + "\n")            os.remove("user_list.txt")            os.rename("use_list.txt.swap", "user_list.txt")            print("\n您输入的错误次数过多,%s 已经被锁定" % user)

 

  

  

转载地址:http://eyrzl.baihongyu.com/

你可能感兴趣的文章
/bin/false和/sbin/nologin的区别
查看>>
CNNIC第31次中国互联网报告,网民规模达5.64亿
查看>>
55. C# -- 不安全代码(Unsafe)
查看>>
CAS 配置(基于tomcat 6)
查看>>
RobotFramework基础总结(一)
查看>>
平面的空间转换
查看>>
我的友情链接
查看>>
Spring MVC 前后台传值
查看>>
我的友情链接
查看>>
使用node-webkit开发exe窗口程序
查看>>
图解:双IP地址引起的网络故障
查看>>
C语言第三天(文件)
查看>>
MongoDB: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
查看>>
第二章 数据,变量和计算
查看>>
openwrt无线连接互联网的实现原理【2】
查看>>
禁止用户使用ctrl+alt+Fn进行tty1-ttyn切换的设置
查看>>
nginx+keepalived+proxy_cache 配置高可用nginx群集和高速缓存
查看>>
Spring cloud 熔断器Hystrix
查看>>
postfix 邮件集群方案(02)
查看>>
内建控制结构之不再使用break和continue
查看>>