导读

您可以通过这篇文章了解到:

  • os模块中的一些方法
  • shutil模块中复制文件的方法
  • 一些写脚本的思路
目的

从事手工测试有段时间了,大多数时间都是重复性的工作, 一直想抽时间写一个“懒人”脚本,既方便以后的工作,又可以锻炼自己的代码能力。
恰好最近在学python,于是就有了下面这个案例

功能简介
  • 访问到共享文件夹,挑选想要的文件
  • 创建本地文件夹,并将复制的文件放进去
  • 文件按一定格式重命名

关键字:访问、挑选、创建、复制、重命名

开始
环境
  1. python 3.7
  2. 模块:os / shutil / time / logging
import os, shutil, time

先从最简单的开始实现,再逐步增加一些想要的功能

1. 创建
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)

在当前目录创建文件夹

2. 访问
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()

获得当前的路径,返回字符串

3. 挑选
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

4. 复制&重命名

因为这两块代码比较少,所以我就放在一起写了

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