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

产生这个需求是在项目的一次图标替换上,当时给了我一堆新图标要替换原来的老图标,可是原来的老图标分布在某个文件夹下的各个子文件夹下面,而新图标全是在同一个目录下的. 手动替换的话,只能是搜索文件名后替换,但是文件很多太麻烦了,没找到现成的工具可以实现我的需求.于是有了下面这个脚本,正好熟悉下刚刚学会的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

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

  1. 使用shell遍历文件夹下的所有图片,并复制一定数量的到新建的子文件夹中

    使用shell遍历一个文件夹下的图片,并复制一定数量的到新建的子文件夹下 大量数据存在同一个文件夹中,想要提取部分使用时直接cp无法准确的控制数量,且将复制的图片又一股脑儿存放在同一新文件夹下仿佛不太 ...

  2. 一个可以下载Github指定子文件夹的Chrome插件

    经常逛GIthub的话,有时会遇到这样的问题:"整个项目文件太多,但我仅仅需要其中的某个文件",下载整个项目所有文件耗费时间和空间. 这个插件完美解决 链接:https://pan ...

  3. 遍历文件夹(含子文件夹)方法

    做法基本上有2大类: ① 经典Dir ② FSO 即 Scripting. File System Object 的[文件系统对象]脚本方法. 一开始可能Dir方法较为普遍,但随着水平的提高,应用FS ...

  4. python读取一个文件夹/子文件夹下的所有文件名字

    python读取一个文件夹/子文件夹下的所有文件名字 示例代码: import osfile_path = './images/' all_file_name = os.listdir(file_pa ...

  5. matlab 把一个文件夹下的所有图片(可以包含在子文件夹下)考到指定文件夹下...

    clc; clear all; maindir = 'C:\Users\wang\Desktop\iLIDS-VID\i-LIDS-VID\images\cam2'; subdir = dir( ma ...

  6. python os.removedirs() 和shutil.rmtree()(os.removedirs用于删除非空文件夹和子文件夹、shutil.rmtree用于删除文件夹下所有文件夹和文件)

    文章目录 shutil.rmtree() os.removedirs() shutil.rmtree() shutil.rmtree() 表示递归删除文件夹下的所有子文件夹和子文件. def rmtr ...

  7. 输出某个目录下的所有文件和文件夹,包括子文件夹中的内容

    IO流中File类中有个listFiles() 方法,它可以返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件.此时用这个方法来讲文件中的所有路径存储在一个数组中,在去判断这个数组中 ...

  8. Linux C 读取文件夹下所有文件(包括子文件夹)的文件名

    本文:http://www.cnblogs.com/xudong-bupt/p/3504442.html Linux C  下面读取文件夹要用到结构体struct dirent,在头#include ...

  9. android 7 创建文件夹,Android 在 res/layout 文件夹 下创建一个 子文件夹实例

    Android 资源文件夹 Layout 文件夹 Layout 文件是存放Android的布局文件的资源文件夹,但是如果你想要在里面创建子文件夹,你会发现xml文件报错. 如何在Layout文件夹下方 ...

  10. PowerShell遍历文件夹下的子文件夹和文件

    PowerShell遍历文件夹下的子文件夹和文件是一件很容易的事儿.Get-ChildItem这个cmdlet就有一个recurse参数是用于遍历文件夹的. PowerShell中,使用Get-Chi ...

最新文章

  1. 10行代码爬取全国所有A股/港股/新三板上市公司信息
  2. vc中常用文件操作(二) Ini文件操作
  3. 如何给Pycharm加上头行 # *_*coding:utf-8 *_*?
  4. 神经网络为什么要归一化
  5. 移动端开发问题及技巧汇总
  6. 拍个自拍,让Python告诉你,军训过后你黑了几度?
  7. php商品在最少购买,ECSHOP给商品设置最少购买数量的方法
  8. pytorch load state dict_学习Pytorch过程遇到的坑(持续更新中)
  9. MPLS ××× Carrier Supporting Carrier Option AB(二)
  10. iPhone11因便宜销量超预期;三星手机曝高危漏洞;xUtils 3.8.3发布 | 极客头条
  11. 正经人一辈子都用不到的 JavaScript 方法总结 (二)
  12. 【Java面试题】40 你所知道的集合类都有哪些?主要方法?
  13. Aspose.PDF使用教程:使用 C# 创建多列 PDF 文档
  14. 旅游新纪元紫山缭绕,静思生活
  15. #10015. 「一本通 1.2 练习 2」扩散(二分+最短路径)
  16. dy极速版-艳云脚本云控系统
  17. php ascii过滤,php过滤ascii控制字符
  18. python爬虫项目-优美图库
  19. Wayland协议了解
  20. Windows达梦数据库安装及整合SpringBoot

热门文章

  1. React开发(111):写注释的方法
  2. [html] history和hash两种路由方式的最大区别是什么?
  3. [html] 页面需要支持多语言,如果是你该怎么做?
  4. 前端学习(2746):uniapp--基本介绍
  5. 前端学习(2633):父子传值
  6. 工作96:当前页面拿id
  7. 工作48:$emit
  8. 前端学习(1747):前端调试值之console用处
  9. java面试题33 Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ).
  10. Git学习(3)GitHub和SVN的区别