• 【Python复用脚本】根据excel表格的IP和资产归属部门,保存docx文件到部门目录


    综述

    @date:2022-09-28

    现实需求:根据word文件名中的IP,在excel查找IP对应的部门,然后把该 word 文件移动到部门目录里。

    脚本实现:

    • 把要处理的文件统一存放到同一目录,然后读取文件名打印到 filename.txt
    • 根据文件名中的ip,查询归属部门,并输出 ip:归属部门 键值对,打印到 belong.txt
    • 人工核对 belong.txt:(一般情况下可以不进行核对)
      • 由于查询结果存在误差,比如查询 192.168.1.1 把 192.168.1.10 的所属部门也保存到 1.1 的结果里面(需要人工核对的内容
      • 对于单个ip同时归属两个部门的情况,可以在移动文件时采用 copy 方式
      • 去重
    • 根据 ip 反查文件名,考虑在提取阶段建立一个 ip:文件名 格式的字典即可。

    部分函数

    获取当前目录下所有 docx 文件的文件名
    def file_name(file_dir):
        for root, dirs, files in os.walk(file_dir):
            # 备注root返回当前目录路径;dirs返回当前路径下所有子目录;files返回当前路径下所有非目录子文件
            return root, dirs, files
    
    
    def write_filename():
        file_dir = "./"
    
        save_filename = "filename.txt"
    
        root, dirs, files = file_name(file_dir)
        f = open(save_filename, 'w', encoding='utf-8')
        for line in files:  # 如果要写入所有的非目录子文件(如.docx,.xlxs文件名,则此处将dirs替换成files变量)
            if ".docx" in line:
                f.write(line + '\n')
        f.close()
    
        print("文件\'{}\'已保存成功!".format(save_filename))
    
    根据文件名提取IP
    def get_ip(docx_name_list):     # 根据文件名规则,提取ip列表
        ip_list = []
        for x in docx_name_list:
            tail = x.find('_')
            ip = x[4:tail]
            ip_list.append(ip)
    
        return ip_list
    

    最终复用脚本

    # coding=utf-8
    
    import os
    import sys
    import xlrd
    import shutil
    
    def file_name(file_dir):
        for root, dirs, files in os.walk(file_dir):
            # 备注root返回当前目录路径;dirs返回当前路径下所有子目录;files返回当前路径下所有非目录子文件
            return root, dirs, files
    
    
    def write_filename():
        file_dir = "./"
    
        save_filename = "filename.txt"
    
        root, dirs, files = file_name(file_dir)
    
    
        docx_name_list = []
        for line in files:  # 如果要写入所有的非目录子文件(如.docx,.xlxs文件名,则此处将dirs替换成files变量)
            if ".docx" in line:
                docx_name_list.append(line)
    
        return docx_name_list
    
    
    def select_from_excel(excel, ip_list, sheet, belong_col):  # 从 excel 中查询 IP 的资产归属情况,并把 ip:归属中心 数据对保存到 belong.txt
        data = xlrd.open_workbook(excel)    # 打开 excel 文件
    
        sheet_1 = data.sheets()[sheet]      # 选择在哪张表里进行查询,此处是第一张表
        nrows = sheet_1.nrows               # 获取该sheet中的有效行数
        ncols = sheet_1.ncols               # 获取该sheet中的有效列数
        getdata = []
    
    
        # 读取文件数据
        belong_list = []
        for ip in ip_list:
            for rowNum in range(0, nrows):
                tep1 = []
                for colNum in range(0, ncols):
    
                    tep1.append(sheet_1.row(rowNum)[colNum].value)
                    if ip in str(sheet_1.row(rowNum)[colNum].value):
    
                        # local = fileName.split('.')
                        # result.append("文件:" + fileName + " 的表 " + worksheets[filenum] + " 找到了 ")
    
                        belong_list.append(ip + ":" + str(sheet_1.row(rowNum)[belong_col].value))
    
        print(belong_list)
    
        f = open("ip_belong.txt", 'w', encoding='utf-8')
        for line in belong_list:  # 如果要写入所有的非目录子文件(如.docx,.xlxs文件名,则此处将dirs替换成files变量)
            f.write(line + '\n')
        f.close()
    
        return belong_list
    
    
    def read_to_list(filename):
        file = open(filename, 'r+', encoding='utf-8')
    
        result_list = list(file.read().split())
    
        file.close()
    
        return result_list
    
    
    def write_to_txt(filename, list):
        f = open(filename, 'w', encoding='utf-8')
        for line in list:  # 如果要写入所有的非目录子文件(如.docx,.xlxs文件名,则此处将dirs替换成files变量)
            f.write(line + '\n')
        f.close()
    
    
    def read_to_dict(filename):
        file = open(filename, 'r+', encoding='utf-8')
        list = file.read().split()
    
        ip_filename_dict = {}
        for x in list:
            single = x.split(":")
            ip_filename_dict[single[0]] = single[1]
    
        return ip_filename_dict
    
    
    def copyfile(old_file_path, new_folder_path):
        shutil.copy(old_file_path, new_folder_path)
    
    
    def first_get_ip_belong(sheet, belong_col):
    
        excel = "D:\\xxx\\主机-汇总.xlsx"
        docx_name_list = write_filename()   # 读取当前目录下的所有docx文件的文件名
    
    
        # 根据文件名规则,提取ip列表
        ip_filename_dict = {}  # ip:文件名 格式的字典,便于根据ip反查文件名
        ip_list = []  # ip 列表
        for x in docx_name_list:
            tail = x.find('_')
            ip = x[4:tail]
            ip_list.append(ip)
            ip_filename_dict[ip] = x
    
        # ip_list = ["10.1.1.165", "10.1.10.166"]
    
        select_from_excel(excel, ip_list, sheet, belong_col)     # 查找 excel,获取到数据对 ip:归属部门,并保存结果到 ip_belong.txt 文件
    
        with open("ip-filename-dict.txt", "w", encoding='utf-8') as f:
            for item in ip_filename_dict:
                f.write(item + ":" + ip_filename_dict[item] + '\n')
            f.close()
    
    
    if __name__ == '__main__':
    
        # 使用说明:把 py 文件存放到 docx 文件所在目录
        # 内置参数:first_get_ip_belong:excel   excel文件的绝对路径
    
        # 第一部分,从 excel 中查询资产归属情况,并保存结果到 ip_belong.txt 文件
    
        sheet = int(input("请输入要统计excel的第几张表,从0开始计数:"))
        belong_col = int(input("请输入资产归属部门所在的列,从0开始计数:"))
        first_get_ip_belong(sheet, belong_col)
    
    
        # 第二部分,需要人工校对修改 ip_belong.txt 文件中的数据
    
    
        # 第三部分,根据筛查后的 ip:部门 获取到 文件名:部门,
        ip_belong_list = read_to_list("ip_belong.txt")
    
        # 根据 IP 反查文件名,然后获取到数据对 文件名:归属部门
        ip_filename_dict = read_to_dict("ip-filename-dict.txt")
        print(ip_filename_dict)
        final_list = []
    
        for belong in ip_belong_list:
            tail = belong.find(':')     # 提取 ip
            ip = belong[:tail]
    
            final_list.append(ip_filename_dict[ip] + ":" + belong[tail+1:])
    
        write_to_txt("filename_belong.txt", final_list)
    
    
        # 第四部分,根据 final_list 中的 文件名:归属部门,copy文件到相应目录
    
        for belong in final_list:
            path = "./" + belong.split(":")[1]
    
            isExists = os.path.exists(path)
    
            if not isExists:    # 如果不存在则创建目录,创建目录操作函数
                os.makedirs(path)
    
            copyfile(belong.split(":")[0], path)
    
    
  • 相关阅读:
    PTA题目 福到了
    [激光原理与应用-15]:《激光原理与技术》-1- 什么是激光,激光概述
    【杂项】如何将指定字体装入电脑然后能在Office软件里使用该字体?
    vscode settings
    【Jvm】性能调优(上)线上问题排查工具汇总
    minikube 实战篇 - mysql部署 - 1
    测试杂谈——一条SQL引发的思考
    23种设计模式2
    04在命令行中使用Maven命令创建Maven版的Web工程,并将工程部署到服务器的步骤
    Day40 JMeter的使用(下)
  • 原文地址:https://blog.csdn.net/soldi_er/article/details/127084803