您可以通过这篇文章了解到:
从事手工测试有段时间了,大多数时间都是重复性的工作, 一直想抽时间写一个“懒人”脚本,既方便以后的工作,又可以锻炼自己的代码能力。
恰好最近在学python,于是就有了下面这个案例
关键字:访问、挑选、创建、复制、重命名
import os, shutil, time
先从最简单的开始实现,再逐步增加一些想要的功能
def mk_local_path(date, project, parent_path):
"""
创建本地路径,需要参数:时间、项目、文件夹
:return: local_path 本地的路径
"""
local_folder = '{} - {}'.format(date, project) # 给本地文件夹命名
local_path = os.path.join(parent_path, local_folder) # 拼接, 得到本地文件夹的路径
os.chdir(parent_path) # 切换到本地文件夹
os.mkdir(local_folder) # 创建本地文件夹
print('Local folder created:%s' % local_path)
return local_path
–即查
关键字 | 作用 |
---|---|
os.path.join(a, b) | 将ab路径拼接到一起,返回拼接好的路径(字符串) |
os.chdir(path) | 切换到指定的路径(类似cd) |
os.mkdir(folder) | 在当前目录创建文件夹 |
def go_to_folder(date, project, share_path):
"""
切换到TestReport当天的文件夹下
:return:
"""
# 如果有产品的子目录,则进入
list_path = os.path.join(share_path, date, project)
if os.path.exists(list_path):
os.chdir(list_path)
# 否则,说明表在当天的文件夹中
elif os.path.exists(os.path.join(share_path, date)):
list_path = os.path.join(share_path, date)
os.chdir(list_path)
else: # 如果以上都不成立,则说明share文件夹还没被创建
print('There is no [{}] folder here\nPlease recheck the folder: {}'.format(date, share_path))
time.sleep(2) # 反应时间,让用户看到上面的信息
os.startfile(share_path) # 打开共享文件夹,让用户确认
exit()
print('current path is:' + os.getcwd())
return list_path
–即查
关键字 | 作用 |
---|---|
os.path.exists(path) | 判断文件是否存在,返回布尔值 |
time.sleep(s) | 程序暂停s秒 |
os.startfile(path) | 打开外部窗口,若传入路径将打开指定文件夹 |
os.getcwd() | 获得当前的路径,返回字符串 |
def choose_file(path):
"""
选择需要的文件
:param path:文件路径
:return:被选中的文件名
"""
list_dir = os.listdir(path)
for i in range(len(list_dir)): # 遍历目标文件夹下的所有文件
print('[{}]----{}\n'.format(i, list_dir[i]))
# 输入序号选择需要的文件
file_code = input('Select file(s) (separator","):').split(',')
file_list = [list_dir[int(i)] for i in file_code]
return file_list
–即查
关键字 | 作用 |
---|---|
os.listdir(path) | 指定目录下的所有文件,返回一个list |
因为这两块代码比较少,所以我就放在一起写了
def copy_file(file_list, source, target, date):
"""
批量复制文件到指定目录,并重命名
:param file_list: 需要复制的文件列表
:param source: 文件源目录
:param target: 目的地目录
"""
os.chdir(source)
for file in file_list:
shutil.copy(file, target) # 复制文件到指定目录
print('Copy successed, there are {} file(s) in the folder:'.format(len(file_list)))
os.chdir(target)
for file in os.listdir(target):
os.rename(file, '{}-{}'.format(date, file)) # 重命名表文件
time.sleep(2)
到此,大概的结构就已经写好了,现在我们可以试着使用一下
if __name__ == '__main__':
# 获取 产品名 和 日期
date = input('Please enter date for today(e.g. 0506):')
project = input('Please enter your tasks for today:')
# 先去到需要复制文件的目录下
share_path = go_to_folder(date, project, share_path=r'\\10.10.60.6\Esri_share\Test Report')
# 挑选需要复制的文件
file_list = choose_file(share_path)
# 创建本地文件夹
local_path = mk_local_path(date, project, parent_path=r'E:\New Folder')
# 复制文件
copy_file(file_list, share_path, local_path, date)
os.startfile(local_path) # 打开本地文件夹
上面的代码有一个弊端,用户首次使用的时候必须要去代码中更改share_path和parent_path,加上下面这个方法来解决这个bug
def check_local_path(file_name):
"""
检查现存路径,有则返回,无则创建
:return: 路径
"""
try:
with open('%s.txt' % file_name, 'r+') as f:
existing_path = f.read()
if existing_path:
print('The existing {} directory is:{}'.format(file_name, existing_path))
# 判断已有的目录是否是期望的
change = input('Change to other directory?\n(Type anything as YES, or press Enter directly as NO):')
if change: # 若change有值说明需要更改
print('Removed old directory')
raise FileNotFoundError # 抛出异常,就会去执行except中的代码
else:
return existing_path
else:
new_path = input('No directory detected, please enter path:')
f.write(new_path)
return new_path
except FileNotFoundError:
with open('%s.txt' % file_name, 'w') as f:
new_path = input('No directory detected, please enter path:')
f.write(new_path)
return new_path
同时,运行代码也要改,目的是去检测share_path和parent_path
if __name__ == '__main__':
share_path = check_local_path('share')
parent_path = check_local_path('local')
# 获取 产品名 和 日期
date = input('Please enter date for today(e.g. 0506):')
project = input('Please enter your tasks for today:')
# 先去到需要复制文件的目录下
file_path = go_to_folder(date, project, share_path)
# 挑选需要复制的文件
file_list = choose_file(file_path)
# 创建本地文件夹
local_path = mk_local_path(date, project, parent_path)
# 复制文件
copy_file(file_list, file_path, local_path, date)
os.startfile(local_path) # 打开本地文件夹
大功告成
回顾一下,实现了选择型批量复制,感觉路径检查那里还可以写得更简单点,还可以增加log的捕获在每个方法中,之后有时间会再来修饰
源代码:https://gitee.com/hao4875/python_script.git