检索文件夹下所有文件大小,验证码,文件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()