Python作业-4 (习题篇)

****Test 7 第一题****

逐页显示文本文件的程序,用户输入一个文件名,每次默认
显示行数为10行,给用户一个选项,”是否继续?(Y|N)

import os


def view(filename):#定义一个显示文件内容的函数
    if os.path.exists(filename):#判断其存不存在
        with open(filename) as f:
            for i in range(10):#显示十行
                a = f.readline()
                print(a.strip())
                if a == '':#不够十行时,显示完就就结束
                    exit()

            user_in = input('是否继续?(Y|N)')
            while 1:#循环显示
                if user_in.upper() == 'Y':
                    for i in range(10):
                        a = f.readline()
                        print(a.strip())
                        if a == '':
                            exit()
                    user_in = input('是否继续?(Y|N)')
                else:
                    break

    else:
        print('未找到该文件!')


view('/root/Desktop/xxx')#将/etc/passwd文件拷贝至桌面做实验


****Test 7 第二题****


将文件夹下所有图片名称加上'_fc',并计算你处理的图片个数和花费时间

import time
import os
list1 = ['/root/Desktop/' + 'day' + str(i)+'.png' for i in range(1, 9)]
for i in list1:#在桌面创建8张照片
    with open(i,'w') as f:
        f.write(i)

def change_name(dirpath):
    if os.path.exists(dirpath):
        start = time.time()
        picture_list = [i for i in os.listdir(dirpath) if i.endswith('.png')
                        or i.endswith('.bmp') or i.endswith('.png') or i.endswith('.gif')
                        or i.endswith('.webp')]#将目录下的图片文件列表
        for i in picture_list:#遍历进行重命名
            a = os.path.splitext(i)
            os.rename(dirpath + i, dirpath + a[0] + '_fc' + a[1])
        print('rename完成!')
        end = time.time()
        return end - start
    else:
        print('未找到该目录!')


print(change_name('/root/Desktop/'))
print(os.listdir('/root/Destop/'))


****Test 7 第三题****


Python在指定目录及其子目录中查找文件名含有关键字的文件



import os

###在桌面创建目录及文件模拟题目环境
info1=['hellopy.py','lkhello.txt','javahello.c','helolo.jpg']
info2=['heihello.py','suphello.txt','sbhello.c']
os.makedirs('/root/Desktop/test/123')
for i in info1:
    os.mknod('/root/Desktop/test/'+i)
for i in info2:
    os.mknod('/root/Desktop/test/123/' + i)


def find_file(dirpath, key):
    if os.path.exists(dirpath):#判断目标目录是否存在

        file_list = [i for i in os.listdir(dirpath) if os.path.isfile(dirpath + i)]#对父目录下的文件列表
        dir_list = [i for i in os.listdir(dirpath) if os.path.isdir(dirpath + i)]#对父目录下的目录列表

        for i in dir_list:#遍历这些子目录

            dirpath = dirpath + i + '/'
            for i in [i for i in os.listdir(dirpath) if os.path.isfile(dirpath + i)]:
                file_list.append(i)##将子目录下的文件添加进文件列表中
        key_file = [i for i in file_list if key in i]#将满足关键字的文件重新列表
        return key_file
    else:
        print('未找到该目录!')


print(find_file('/root/Desktop/test/', 'hello'))



****Test 7 第四题****


修改之前的用户管理系统,将用户信息保存在文件中;
    保存格式为: 用户名,密码....(注意:相关信息用逗号分隔);
"""

#<eval(dict)将字符串转换为字典>

info={'root': {
        "name": "root",
        "passwd": "redhat",
        "gender": 1,  # 1:男,2:女;
        "email": "[email protected]",
        "age": 18,
        'time': '2018-05-07 15:27:06'}}

with open('/root/Desktop/info', 'w') as f:#将字典信息写入文件中
    f.write(str(info))
menu = """"

    1). 注册新用户
    2). 删除用户
    3). 显示用户信息
    4). 退出系统(exit(0))

"""


def addUser():
    print("01-用户注册界面".center(20, '*'))
    inname = input("*注册用户名:").strip().lower()
    # 判断用户是否已注册?
    with open('/root/Desktop/info') as f:
        for i in f:
            if inname not in eval(i).keys():

                passwd = input("*密码:")
                gender = input("性别(1-男,2-女):")
                if not gender:
                    gender = None
                else:
                    gender = int(gender)
                email = input("邮箱地址:")
                if not email:
                    email = None
                age = input("年龄:")
                if not age:
                    age = None
                else:
                    age = int(age)
                info[inname] =  {
                    "name": inname,
                    "passwd": passwd,
                    "gender": gender,  # 1:男,2:女;
                    "email": email,
                    "age": age
                }
                with open('/root/Desktop/info', 'w') as f1:#将注册信息保存在文件中
                    f1.write(str(info))
                    print("用户%s注册成功" % (inname))
                    break
            else:
                print('Error:用户%s已注册!' % (inname))


def deleteUser():
####删除文件中信息
    with open('/root/Desktop/info') as f:
        a = [eval(i).keys() for i in f][0]
        inuser = input("注销的用户名:").strip().lower()
        if inuser in a:#判断用户是否存在
            info = ''
            ###通过重新写入删除文件信息
            for i in f:
                if inuser in eval(i).keys():
                    pass
                else:
                    info += ('\n' + i)
            with open('/root/Desktop/info', 'w') as f1:
                f1.write(info)
                print('%s用户成功注销!' % inuser)

        else:
            print("用户名%s不存在" % (inuser))


def make():
    while True:
        print("用户管理系统".center(40, '*'), menu)
        choice = input("请输入你的选择:")
        if choice == '1':
            addUser()
        elif choice == '2':
            deleteUser()
        elif choice == '3':
            with open('/root/Desktop/info') as f:
                print(f.read())
        elif choice == '4':
            exit(0)
        else:
            print("Error:错误输入!<请输入正确的选择.>")


def main():
    import time
    tryCount = 0
    while tryCount < 3:
        tryCount += 1
        inuser = input("用户名:").strip().lower()
        with open('/root/Desktop/info') as f:
            for i in f:
                if inuser in eval(i).keys():
                    inpasswd = input("密码:")
                    passwd = eval(i)[inuser]['passwd']
                    if inpasswd == passwd:
                        print("%s登陆成功!" % (inuser))
                        times = int(time.time())
                        if times - time.mktime(
                                time.strptime(eval(i)[inuser]['time'], '%Y-%m-%d %H:%M:%S')) < 4 * 60 * 60:
                            print('You already logged in at:%s ' % eval(i)[inuser]['time'])
                        eval(i)[inuser]['time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(times))
                        make()
                    else:
                        print("用户%s的密码错误!" % (inuser))
                else:
                    print("用户名%s不存在" % (inuser))
    else:
        print("尝试次数超过3次!")


main()





****Test 7 第五题****


修改之前的ATM管理系统,要求如下:
1). 每个选项操作前,显示用户欢迎信息;
    eg "***************ATM系统转账操作***************"
    eg "***************ATM系统存款操作***************"

2). 用户执行操作前显示操作时间;
3). 用户执行后显示结束时间;
4).要求时间格式不是时间戳,而是我们可以看懂的(百度搜索);


info = {
    "001": {
        "cardid": "001",
        "password": "123",
        "status": 0,
        "money": 10000
    }}

menu = """"

    1). 注册新用户
    2). 取款
    3). 存款
    4). 转账
    5). 查询余额
    6). 冻结账户
    7). 修改密码
    8). 退出

"""


def main():
    tryCount = 0
    while tryCount < 3:
        tryCount += 1
        inuser = input("用户名:").strip().lower()
        if inuser in info:
            if info[inuser]['status'] == 0:
                inpasswd = input("密码:")
                passwd = info[inuser]['password']
                if inpasswd == passwd:
                    print("%s登陆成功!" % (inuser))
                    while True:
                        print("用户管理系统".center(40, '*'), menu)
                        choice = input("请输入你的选择:")
                        if choice == '1':
                            add_user()
                        elif choice == '2':
                            out_money(inuser)
                        elif choice == '3':
                            in_money(inuser)
                        elif choice == '4':
                            trans_money(inuser)
                        elif choice == '5':
                            view(inuser)
                        elif choice == '6':
                            freeze(inuser)
                        elif choice == '7':
                            mod_passwd(inuser)
                        elif choice == '8':
                            exit(0)
                        else:
                            print("Error:错误输入!<请输入正确的选择.>")
                else:
                    print("用户%s的密码错误!" % (inuser))
            else:
                print('该用户处于冻结状态,请前往服务台办理服务!')
        else:
            print("用户名%s不存在" % (inuser))
    else:
        print("尝试次数超过3次!")


def add_log(fun):
    import datetime
    def wrapper(*args, **kwargs):
        print(datetime.datetime.now())
        a = fun(*args, **kwargs)
        print(datetime.datetime.now())
        return a

    return wrapper


@add_log
def add_user():
    print("用户注册界面".center(20, '*'))
    cardid = input("*注册用户名:").strip().lower()
    # 判断用户是否已注册?
    if cardid in info:
        print('Error:用户%s已注册!' % cardid)
    else:
        password = input("*密码:")
        status = int(input("状态(1-冻结,0-使用):"))
        info[cardid] = {
            "cardid": cardid,
            "password": password,
            "status": status,  # 1:男,2:女;
            "money": 0
        }
        print("用户%s注册成功" % (cardid))


@add_log
def out_money(inuser):
    print("ATM系统取款操作".center(20, '*'))
    moneycount = int(input('取钱金额:'))
    if moneycount <= info[inuser]['money']:
        info[inuser]['money'] -= moneycount
        print('出款成功!')
    else:
        print('余额不足!')


@add_log
def in_money(inuser):
    print("ATM系统存钱操作".center(20, '*'))
    moneycount = int(input('请输入存款金额:'))
    info[inuser]['money'] += moneycount
    print('存款成功!')


@add_log
def trans_money(inuser):
    print("ATM系统转账操作".center(20, '*'))
    inuser1 = input('请输入账户名:')
    if inuser1 not in info:
        print('Error!该用户不存在!')
    else:
        money = int(input('请输入金额:'))
        if info[inuser]['money'] >= money:
            info[inuser]['money'] -= money
            info[inuser1]['money'] += money
            print('转账成功!')
        else:
            print('余额不足!')


@add_log
def view(inuser):
    print("ATM系统查询操作".center(20, '*'))
    print('余额为:%s' % info[inuser]['money'])


@add_log
def freeze(inuser):
    print("ATM系统冻结账户操作".center(20, '*'))
    info[inuser]['status'] = 1
    print('用户已冻结!')
    exit(0)


@add_log
def mod_passwd(inuser):
    print("ATM系统密码修改操作".center(20, '*'))
    while 1:
        newpasswd = input('请输入新密码:').strip()
        if not newpasswd:
            print('密码不能为空')
        else:
            break
    again = input('请再次输入密码:').strip()
    if newpasswd == again:
        info[inuser]['password'] = newpasswd
        print('密码修改成功!')
    else:
        print('失败!两次密码不一致!')


main()





****练习test1  文件操作****


序号 ID 操作者 操作行为 操作行为 操作对象
6883 556773833 RemyMCMXI
6880 556772838 Mindmatrix restored undeleted RemyMCMXI
6882 556771715 RemyMCMXI
6881 556770863 RemyMCMXI
6880 556673938 Liua97
6879 554350969 Epicgenius
6880 554332653 Alex

找到restored所在行,得到该行序号6880,然后往下读,
找到第一个与其序号相同的行(liua97那行),
然后记录下这两行之间所有的id值(包括restored那行),
这个例子就是记录下556772838 556771715 556770863这三个id

with open('/root/Desktop/test1', 'a+') as f:#创建文件
    f.write('6883 556773833 RemyMCMXI\n'
            '6880 556772838 Mindmatrix restored undeleted RemyMCMXI\n'
            '6882 556771715 RemyMCMXI\n'
            '6881 556770863 RemyMCMXI\n'
            '6880 556673938 Liua97\n'
            '6879 554350969 Epicgenius\n'
            '6880 554332653 Alex\n')
    f.seek(0,0)
    info = [i.split() for i in f]#遍历文件内容,转换成列表方式嵌套方式记录内容
    num = len(info)
    for i in range(num):
        if 'restored' in info[i]:#找到关键字所在行
            for j in range(i + 1, num):
                if info[i][0] == info[j][0]:#找到与关键字所在行ID相同的一行
                    print([k[1] for k in info[i:j]])#遍历输出所有ID
                    break




****练习test2  循环提取文件内容****



import os
#在桌面创建八个文件并输入内容
list1 = ['/root/Desktop/' + 'day' + str(i)+'.py' for i in range(1, 9)]
for i in list1:
    with open(i, 'w') as f:
        f.write(i)

#模拟题目要求,在桌面进行文件内容合并
def combine(dirpath, suffix, newdirpath, newname):#定义合并函数
    if os.path.exists(dirpath) and os.path.exists(newdirpath):
        oldfile = [i for i in os.listdir(dirpath) if i.endswith(suffix)]#找到所有需要进行合并的文件
        for i in oldfile:
            with open(dirpath + i) as f1, open(newdirpath + newname, 'a+') as f2:#依次写入新文件中
                for i in f1:
                    f2.write(i+'\n')
                    os.remove(i)#写入完成.删除源文件
        print('文件合并完成!')
    else:
        print('找不到该目录!')
combine('/root/Desktop/','.py','/root/Desktop/','all.py')
with open('/root/Desktop/all.py') as f:
    print(f.read())




****练习test3  日志文件****


# 1. 创建add_log装饰器, 被装饰的函数日志信息被记录到/var/log/python.log文件中;
# 2. 日志格式为: [字符串时间] Level: 日志级别 Name: 函数名称, Runtimexxx  Result:xxx
[]: 装饰器带有参数;
import time


# 创建装饰器
def add_log(type):
    def add_info(fun):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            time.sleep(1)
            a = fun(*args, **kwargs)
            end_time = time.time()

            with open('/var/log/python.log', 'a+') as f:  # 记录日志
                f.write('%s  Level : %s , Name:%s , Runtime:%.5d  Result : %s'
                        % (time.ctime(), type, fun.__name__, end_time - start_time, a))
                print('日志记录成功!')

        return wrapper

    return add_info


@add_log('warn')
def python(x, y):
    return x * y / 2


python(4, 5)
with open('/var/log/python.log') as f:
    print(f.read())




***********THE END***********

猜你喜欢

转载自blog.csdn.net/wl_python/article/details/80327486