人生苦短,我用Python(一)—Python实现指定文件夹中同类文档的收集工作

本文主要是介绍人生苦短,我用Python(一)—Python实现指定文件夹中同类文档的收集工作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面:博主本职工作为网络工程师,对于编程没有系统的学过也欠缺实战经验。学习Python全凭兴趣爱好,通过《Python编程快速上手++让繁琐工作自动化》一书入门。

开启《人生苦短,我用Python》系列博文,主要是为了记录自己在Python编程实践过程中所积累的知识和经验,同时希望也能将我的一些经验分享给有需要的人。文中的语句均为经过验证的语句,但由于缺乏系统的学习,难免存在错误,还请各位包涵并指出。

需求:本人供职于甲方,网络设备维保商会定期通过巡检工具,抓取网络设备状态。描述每台网络设备状态的文件,会分别保存到以网络设备IP地址和Hostname为文件夹名称的文件夹中。如下图:(关于通过python实现抓取网络设备状态的功能,可通过netmiko库连接设备,登陆后执行相关操作,该功能目前我已开发完成。可以在之后整理成文章发布到博客。)

在这样的,情况下,如果想要将不同网络设备的同一类信息集合在一起,例如:配置信息。需要在每台设备的文件夹中找到对应的文件,复制到新的文件夹中,更改名称。这一类操作,从寻找->复制->粘贴->改名这一系列操作较为繁琐且无技术含量,浪费工作时间。所以想到,用python脚本实现这部分工作的自动化。

本次以,抓取不同网络设备的配置文件为例,熟悉思科设备的人都知道,在思科设备上,执行show running-config。完成当前运行配置的收集工作。所以,目前,关于思科设备,每个以设备名称命名的文件夹中,都有一个show running-config的配置文件,我需要做的就是,找到这个文件,复制这个文件到新的文件夹,并将复制过来的文件改名为其原属文件夹的名称。

在这里,我们主要用到三个python模块。

  1. OS模块—用于对文件、文件夹进行遍历等操作。
  2. shutil模块—用于对文件进行复制操作。
  3. datetime模块—该模块不是必须,本人习惯用该模块创建带有脚本执行日期的文件或文件夹。

先来看整体语句:

def findFile(path,example):import os,shutil,datetime#print(path)#print(example)dayTime = datetime.datetime.now().strftime('%Y_%m_%d')i=0if os.path.exists('.\\'+dayTime+example)!=True:os.makedirs('.\\'+dayTime+example)for fPath,fDirs,fFile in os.walk(path):for f in fFile:if f == example:#print(fPath)print(os.path.join(fPath,f))srcfile = os.path.join(fPath,f)newFile=os.path.basename(fPath)#print(newFile)dstfile = '.\\'+dayTime+example+'\\'+newFile+'.txt'shutil.copyfile(srcfile,dstfile)i=i+1else:continueprint('已完成目录'+path+'的检索')i=str(i)print('共找到匹配文件'+i+'个')path='.\\A公司巡检'
example='show running-config.txt'
findFile(path,example)

针对其中的重点语句进行讲解

os.walk(path)

path代表将要遍历的目录,os.walk()会返回三个元素的元组(fPath,fDirs,fFile),分别代表path下的所有路径,该路径下的目录列表和该路径下的文件列表。

例如我想遍历下面这个目录:

语句如下:

import os
for fPath,fDirs,fFile in os.walk('.\\venv'):print('Path:%s'%fPath)print('Dir:%s'%fDirs)print('File:%s'%fFile)

例如,第一次会遍历venv这个目录本身,列出目录下的目录和文件,结果如下:

Path:.\venv
Dir:['Include', 'Lib', 'Scripts']
File:['pyvenv.cfg']

接下来,会遍历Inclue这个目录,列出该目录下的目录和文件,结果如下:

Path:.\venv\Include
Dir:[]
File:[]

可见,Inclue这个目录下,没有其他目录,则Inclue的遍历完成。会继续遍历Lib这个目录,如下:

语句执行结果,如下:

Path:.\venv\Lib
Dir:['site-packages', 'tcl8.6']
File:[]
Path:.\venv\Lib\site-packages
Dir:['pip-9.0.1-py3.4.egg']
File:['easy-install.pth', 'setuptools-28.8.0-py3.4.egg', 'setuptools.pth']

可见,os.walk()默认会从上到下依次遍历目录下所有子目录和文件,若有子目录,再遍历子目录下的目录和文件,一直进行下去,直到所有的目录都被遍历过。每一次遍历会返回正在遍历的路径,该路径下的目录列表和文件列表。

回到程序本身,利用os.walk()遍历指定路径下的所有目录,再确认遍历的目录对应的文件列表中,是否包含与我想查找的文件相匹配的文件。具体实现语句如下:

    for fPath,fDirs,fFile in os.walk(path):for f in fFile:if f == example:

若找到匹配的文件,则获取改文件所在路径,同时获取该文件所在文件夹的名称,作为复制后的文件的名称。最后将源文件进行复制,并改名为其原属文件夹的名称,实现语句如下:

srcfile = os.path.join(fPath,f)
newFile=os.path.basename(fPath)
dstfile = '.\\'+dayTime+example+'\\'+newFile+'.txt'
shutil.copyfile(srcfile,dstfile)

这样便完成了需求中最重要的部分,找到源文件->复制->粘贴->改名。

该语句的执行结果如下:

当然,你也可以用这段语句实现搜索指定文件夹,指定文件的功能。

后续,可以将该功能通过flask网页呈现,或通过Tkinter实现GUI。之后将在其他文章描述这部分功能的实现。

这篇关于人生苦短,我用Python(一)—Python实现指定文件夹中同类文档的收集工作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508588

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso