使用某个文件夹下的所有文件去替换另一个文件夹下及其子文件夹下存在的同名文件(Python实现)...

值此新年即将到来之际,在这献上今年最后一篇文章.

产生这个需求是在项目的一次图标替换上,当时给了我一堆新图标要替换原来的老图标,可是原来的老图标分布在某个文件夹下的各个子文件夹下面,而新图标全是在同一个目录下的. 手动替换的话,只能是搜索文件名后替换,但是文件很多太麻烦了,没找到现成的工具可以实现我的需求.于是有了下面这个脚本,正好熟悉下刚刚学会的Python. 如果有人知道有什么工具可以完成的话不妨留言告知:).

下面脚本实现的就是在dest目录及其子目录下面,寻找和src目录下的文件对应的同名文件,如果找到唯一的一个同名文件,用src里面的新文件替换dest里面对应的老文件. 如果没找到同名或有多个同名的,就忽略.因为这种情况下需要人工接入是否替换,不过这样工作量已经少了很多了.

 

代码通过扫描一遍dest目录及其子目录,建立了以文件名为索引,文件所在目录名为键值的倒排索引. 然后对src目录下的每个文件名去刚刚建立的倒排索引中寻找键值,如果键值中刚好只有一个目录名,说明找到了对应的唯一同名文件,替换之.其他的忽略.

代码如下:

 

代码
#!/usr/bin/env python
#
coding:UTF-8

import os,sys,shutil
from os import path

def findandreplace(src,dest):
srcfiles
= os.listdir(src)
destfilesdict
= {}
#处理目标路径下(含子目录下)的所有文件
for root,dirs,files in os.walk(dest):
# 记录每个文件名所在的路径,多个同名文件则会有多个不同路径.
# 这样就生成了文件名到文件所在路径的一个倒排索引
for onefile in files:
# 若该文件名的键值还未创建则先创建
if onefile not in destfilesdict:
destfilesdict[onefile]
= []
destfilesdict[onefile]
+= [root]
multisamename
= []; # 存储目标目录及其子目录下有多个同名文件的文件名
for srcfile in srcfiles:
fullsrcfile
= os.path.join(src,srcfile)
if os.path.isfile(fullsrcfile):
if srcfile in destfilesdict:
if len(destfilesdict[srcfile])>1:
multisamename
+= [srcfile]
else:
# 有且只有唯一的一个同名文件,那么肯定是要替换的那个
shutil.copy(fullsrcfile,destfilesdict[srcfile][0]+'/'+srcfile)
print srcfile + ' replace success.'
print 'following files has more than one in dest directory, replace skipped.'
print '\n'.join(multisamename);

if __name__ == "__main__":
args
= sys.argv
if len(args) > 2:
src
= args[1]
dest
= args[2]
print "all files under the "+dest+\
"(including the subdirectory) will be replaced by the files under " +\
src
+" where they have the same name."
if raw_input('Sure(y/n?): ') == 'y':
findandreplace(src,dest)
else:
print "Not enough arguments!"

 

测试代码如下:

代码
#!/usr/bin/env python
#
coding:UTF-8

import os,sys
import shutil
import findandreplace

rootdir
= 'd:/test/'
testsrcdir
= 'testsrc'
testdestdir
= 'testdest'
testfile
= { 'notexist' : ['001','002','003','004','005'], # 替换目标不存在的文件
'onlyone' : ['101','102','103','104','105'], # 有唯一对应的文件存在的
'morethanone':['201','202','203','204','205']} # 多于一个同名存在的
testfileext = '.txt'
# clear old test files
shutil.rmtree(os.path.join(rootdir,testsrcdir),True)
shutil.rmtree(os.path.join(rootdir,testdestdir),True)
# generate src files
os.makedirs(os.path.join(rootdir,testsrcdir))
for key,values in testfile.iteritems():
for filestr in values:
srcfile
= open(os.path.join(rootdir,testsrcdir,filestr+testfileext),'w')
srcfile.write(filestr
+'srcfile')
srcfile.close()
# generate dest files
os.makedirs(os.path.join(rootdir,testdestdir))
for key,values in testfile.iteritems():
if key == 'notexist':
pass
elif key == 'onlyone':
for filestr in values:
newdir
= os.path.join(rootdir,testdestdir,filestr)
os.makedirs(newdir)
srcfile
= open(os.path.join(newdir,filestr+testfileext),'w')
srcfile.write(filestr
+'destfile')
srcfile.close()
elif key=='morethanone':
for filestr in values:
newdir
= os.path.join(rootdir,testdestdir,filestr)
os.makedirs(newdir)
srcfile
= open(os.path.join(newdir,filestr+testfileext),'w')
srcfile.write(filestr
+'destfile')
srcfile.close()
srcfile
= open(os.path.join(rootdir,testdestdir,filestr+testfileext),'w')
srcfile.write(filestr
+'destfile')
srcfile.close()

findandreplace.findandreplace(os.path.join(rootdir,testsrcdir),os.path.join(rootdir,testdestdir))

 

Python真是提高效率的利器哈.

 

转载于:https://www.cnblogs.com/absolute8511/archive/2010/12/31/1923415.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OS学习笔记】三十二 保护模式九:分页机制对应的汇编代码之---内核代码

本片文章是以下两篇文章: 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 对应的内核汇编代码。 ;代码清单16-1;文件名:c16_core.asm;文件说明&#xf…

Spring中HibernateTemplate类的使用

实际情况中,对于编程事务的操作最好还是使用org.springframework.transaction.support.TransactionTemplate,因为HibernateTemplate在实际操作中并不是想象的那样,具体如下: 目的:使用HibernateTemplate执行execute&am…

【OS学习笔记】三十三 保护模式九:分页机制对应的汇编代码之---用户程序代码

本片文章是以下两篇文章: 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 对应的用户程序汇编代码。 ;代码清单16-2;文件名:c16.asm;文件说明&#xff…

一款研发管理软件的对象标签介绍

如果你了解WIKI,WIKI中的所有信息链接以标签的方式网状关联。TOPO系统中实现了完整的TAG功能,区别于目前市面上的其他类似管理系统,TOPO系统中实现的标签功能更加彻底和全面,例如完全用户自定义TAG,系统中所有管理对象…

【OS学习笔记】三十四 保护模式十:中断和异常区别

上几篇文章学习了分页机制的一些原理: 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 今天继续学习保护模式下的关于中断与异常的概念。本文主要学习中断与异常的…

记录一次文件迁移

事情的经过是这样子的!数据库A表添加一条记录,**系统中B目录下就会多出5n个文件。随着系统运行3年多,B目录中的文件数已高达2M多,而这些文件恰恰又是用户高度频繁访问的。于是问题就来了,一方面是用户访问文件速度变慢…

【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门

上一篇文章学习了中断与异常的概念:【OS学习笔记】三十四 保护模式十:中断和异常区别 本片文章接着学习以下内容: 中断描述符表中断门陷阱门 1 中断描述符表 我们前面讲了无数次,在实模式下,是由位于低地址的1M内存…

【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中断任务

上一篇文章学习了:OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门 本篇文章接着上一篇文章学习中断任务。 我们在前面文章中一直在说通过中断发起任务切换,本文就是将之前没有说明白的内容:通过中断发起任务切换讲…

GC是什么? 为什么要有GC?

答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc()Runtime.getRuntime().gc() 转载于:https://www.cnblogs.com/mianshi/archive/2011/01/05/192663…

【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码

本文是以下几篇文章对应的主引导扇区代码汇编代码: 【OS学习笔记】三十四 保护模式十:中断和异常区别【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中…

过滤JSON中的特殊字符

过滤方法用的是Discuz中的过滤方法&#xff01; /// <summary>/// 加载事件/// </summary>/// <param name"sender"></param>/// <param name"e"></param>protected void Page_Load(object sender, EventArgs e){if(!…

【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码

本文是以下几篇文章对应的微型内核代码汇编代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任务切换----中断…

小议传统分层与新式分层,抑或与DDD分层

引言本文提到的分层只是软件架构上的分层。文中的传统分层指的是传统的三层结构&#xff1a;UI&#xff08;界面表现层&#xff09;,BLL&#xff08;业务逻辑层&#xff09;,DAL&#xff08;数据访问层&#xff09;。文中提出的观点也都是个人的一点认识&#xff0c;与任何组织…

【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码

本文是以下几篇文章对应的动态加载的用户程序/任务一代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任务切…

WCF 第八章 安全 客户端认证

一个服务的客户端认证是通过向服务提供一系列信赖的声明。声明可以是任何形式&#xff0c;只要客户端和服务端理解这个格式并信赖它的来源就可以。 如果客户端和服务端共享一个秘密信息&#xff0c;比如一个用户名和密码&#xff0c;只要客户端通过一个合法认证发送数据&#x…

前端学习(205):animation动画库

动画库 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" conte…

【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码

本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任…

JS调用后台方法大全

javascript函数中执行C#代码中的函数&#xff1a;方法一&#xff1a; 1、首先建立一个按钮&#xff0c;在后台将调用或处理的内容写入button_click中;    2、在前台写一个js函数&#xff0c;内容为document.getElementById("btn1").click();    3、在前台或后…

【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 本文是将个人的关于《X86汇编语言-从实模式…

C语言编译全过程剖析

内容摘要 C语言编译的整个过程是非常复杂的&#xff0c;里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的&#xff0c;深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的&#xff0c;希望大家可以多了解一些&#xff0c;在遇到问题时多思考、多实践。 一…