检索文件夹下所有文件大小,验证码,文件copy脚本,模拟进度条-练习

一、检索文件夹下所有文件的大小的程序

注意: 文件夹也有大小, 我们这里不统计文件夹的大小, 排除os.path.getsize方法.

1. 实现方式一: 在py中执行os命令

  • main.py
import os
import sys


def auth_cmd_input():
    argv_list = sys.argv
    if len(argv_list) == 2:
        folder_path = argv_list[1]
        if os.path.exists(folder_path):
            return folder_path
        else:
            print("对不起, 该路径下不存在文件夹/目录")
    else:
        print("对不起, 传入格式错误. 格式: python3.8 run.py folder/file")


def get_all_files_size(folder_path):
    size = 0
    if os.path.isfile(folder_path):
        return os.path.getsize(folder_path)

    for file_or_dir in os.listdir(folder_path):  # os.listdir不能判断文件, 如果是文件会抛出异常(NotADirectoryError)
        path = os.path.join(folder_path, file_or_dir)
        if os.path.isfile(path):
            size += os.path.getsize(path)
        else:
            # return search_folder_size(path)  # 注意: 这里不能加return。
            # 递归一旦return 递归里面的内容,就不会继续往下走了, 从当前位置直接开始回溯,得到最终的结果
            # 因为递归是在需要得到预期的结果的时候再去return, 这个return必须严格控制好(return之前, 我们要重新调用search_folder_size(path), 这个时候当它是一个文件的时候, 它的size就是一个全新的size=0, 计算完毕以后开始回溯, 回溯回来以后, 我们之前有个return这个时候就把那个size=0, 0当做结果返回了)
            get_all_files_size(path)
    return size


def run():
    folder_path = auth_cmd_input()
    if folder_path:
        res = get_all_files_size(folder_path)
        print('统计了您输入地址的大小, 目前大小: %s  %sKB' % (res, res / 1024))
    else:
        print("对不起, 您的输入有误!")


run()
  • run.py 执行该文件
import os


def execute_cmd():
    while True:
        path = input("[退出: Q/q]请输入您要统计的文件或文件夹路径>>:").strip()
        if path.lower() == 'q':
            break
        current_execute_file = os.path.normpath(os.path.join(__file__, '..', 'main.py'))
        os.system(f'python3 "{current_execute_file}" "{path}"')


execute_cmd()

2. 实现方式二: 在终端中输入对应格式的

# 要求执行方式如下
# python3.8 run.py 文件夹
import os
import sys


def system_cmd_search() -> str:
    argv_list = sys.argv
    if len(argv_list) == 2:
        folder_path = argv_list[1]
        if os.path.exists(folder_path):
            return folder_path
        else:
            print("对不起, 该路径下不存在文件夹/目录")
    else:
        print("对不起, 传入格式错误. 格式: python3.8 run.py folder/file")


def search_folder_size(folder_path):
    size = 0
    for file_or_dir in os.listdir(folder_path):
        path = os.path.join(folder_path, file_or_dir)
        if os.path.isfile(path):
            size += os.path.getsize(path)
        else:
            return search_folder_size(path)
    return size


def run1():
    folder_path = system_cmd_search()
    if not folder_path:
        exit()
    res = search_folder_size(folder_path)
    print('统计了您输入地址的大小, 目前大小: %s  %sKB' % (res, res / 1024))


if __name__ == '__main__':
    run1()

二. 随机验证码验证, 在进入文件copy脚本, 并实现模拟下载以及打印进度条

import random
import time
import sys
import os

# 随机验证码
def verify_code(verify_code_length=4):
    li = []
    for i in range(verify_code_length):
        small_letter = chr(random.randint(97, 122))
        big_letter = chr(random.randint(65, 90))
        int_number = str(random.randint(0, 9))
        random_choice = random.choice([small_letter, big_letter, int_number])
        li.append(random_choice)
    return ''.join(li)


# 文件copy脚本 +模拟下载以及打印进度条
def progress(percent, symbol='#', width=50):
    if percent > 1:
        percent = 1
    show_progress = ("[%%-%ds]" % width) % (int(percent * width) * symbol)
    print("\r%s %.2f%%" % (show_progress, percent * 100), end='')


def copy_file(src_file, dst_file):
    if not os.path.isfile(src_file):
        print('对不起, 原文件路径不存在')
        return
    if os.path.isfile(dst_file):
        while True:
            confirm = input("你执行的拷贝路径中已近有该文件, 是否覆盖: Y/N:").strip()
            if confirm.lower() == 'y':
                break
            elif confirm.lower():
                return
    with open(src_file, 'rb') as f1, \
            open(dst_file, 'wb') as f2:
        recv_size = 0
        total_size = os.path.getsize(src_file)
        while recv_size < total_size:
            print("copy start ...")
            for line in f1:
                f2.write(line)
                recv_size += len(line)
                time.sleep(1)
                percent = recv_size / total_size
                progress(percent)
            print('\n', 'copy successful...')


def run2():
    while True:
        # 拿到验证码的返回值
        verify_res = verify_code()
        print(verify_res)
        inp_verify = input("输入验证码进行认证>>:").strip()
        if inp_verify.lower() != verify_res.lower():
            print("对不起, 输入错误")
            continue
        src_file = input("原文件路径>>:").strip()
        dst_file = input("目标文件路径>>:").strip()
        copy_file(src_file, dst_file)


if __name__ == '__main__':
    run2()
posted @ 2020-03-30 23:40  给你加马桶唱疏通  阅读(169)  评论(0编辑  收藏  举报