运营那边有个需求。

下载了一批视频文件,由于当时下载的时候陆陆续续创建了很多文件夹,并且,每个文件夹下面还有子文件夹以及视频文件,子文件夹下面有视频文件或者文件夹

现在因为需要转码,转码软件只能对单个文件夹操作。

这时候找上我,问我能不能帮忙把所有的文件单独提取出来到一个文件夹中。他们那边转码完毕,还要放回原来的文件夹

这边琢磨下下。匆忙写了个脚本。功能实现了。但是代码需要优化(后面有空了再说吧)

使用递归方法获取每个文件绝对路径(不要单独的目录),并放入列表中。最终存到excel表中

excel表存2列,第一列是每个文件的绝对目录,第二列是文件名

使用shutil模块移动文件(这里是剪切,因为文件比较多。太占空间了)

考虑到目录中可能存在文件名一致的文件,这样移动到一个目录的话可能会覆盖原来的。

这边考虑文件名一致的话不移动,但是记录下路径。让运营决定怎么处理同名的文件(因为可能他们要存2份,或者说文件名一致,实际文件内容是有差别的)

失败记录.log文件用于记录在移动文件过程中某文件名变化或者文件不存在

(因为文件较多,这里有6000多文件。文件列表很快就获取到,但是从文件列表逐个移动文件过程中,万一某文件由于人为操作删除或者改名了或者其它因素导致列表中文件路径不对了。因此用了if else判断记录下)

重名文件信息.log用于记录重名文件。这个是给运营看的。让他们决定如何处理重名文件

这里多了一些print操作以及time.sleep操作,是为了后面打成exce程序执行的时候好看点,不然一个黑洞洞的窗口不太友善。多一些输出信息显得好点(文件太少的话可能瞬间执行完毕了。sleep一下显得好点)

!!!最后注意下,因为此脚本最后打成exe程序。准备放入某目录下执行。因此这里的this_path获取的是当前路径。假如自己使用pycharm或者python工具测试,需要指定一下测试路径

比如this_path="D:\\work\\tmp"

否则可能把你当前目录下的文件都移走到all_files下面了

  1. import os
  2. import xlwt,time,shutil
  3. #获取当前文件所在绝对目录路径
  4. this_path=os.path.abspath('.')
  5. #定义个列表存放每个文件路径,便于后期操作
  6. file_list=[]
  7.  
  8. #创建个方法,统计每个文件路径,并追加列表中。用到了递归
  9. def get_all_file(dir_path):
  10. for file in os.listdir(dir_path):
  11. # print(file)
  12. filepath=os.path.join(dir_path,file)
  13. # print(filepath)
  14. if os.path.isdir(filepath):
  15. get_all_file(filepath)
  16. else:
  17. file_list.append(filepath)
  18. return file_list
  19. #执行上面方法,把每个文件绝对路径追加到列表中
  20. get_all_file(this_path)
  21.  
  22. #定义总目录名,准备存放列表中所有文件
  23. target_dir='all_files'
  24. #创建一个总视频目录,用于存放视频文件
  25. if not os.path.exists(target_dir):
  26. print(target_dir+'作为总视频目录不存在,正在创建.....')
  27. time.sleep(2)
  28. os.mkdir(target_dir)
  29. print(target_dir+"总视频目录创建成功")
  30. time.sleep(2)
  31.  
  32. #创建一个excel表存放文件路径信息,第一列是目录,第二列是文件名
  33. wb = xlwt.Workbook()
  34. sh = wb.add_sheet('文件和目录信息')
  35. row_count=0
  36. for file in file_list:
  37. dir_filename=os.path.split(file)
  38. sh.write(row_count,0,dir_filename[0])
  39. sh.write(row_count,1,dir_filename[1])
  40. row_count+=1
  41.  
  42. wb.save("文件路径信息统计结果.xls")
  43.  
  44. #定义个日志存放异常信息以及重名文件
  45. f_fail = open('失败记录.log','a') # 追加模式
  46. f_same= open('重名文件信息.log','a') # 追加模式
  47. #移动文件
  48.  
  49. print("开始移动文件.................")
  50. time.sleep(2)
  51. for file in file_list:
  52. if os.path.exists(file):
  53. file_name=os.path.split(file)[1]
  54. target_path=os.path.join(target_dir,file_name)
  55. if os.path.exists(target_path):
  56. print(target_dir+"目录中----"+file_name+"----已经存在,移动失败")
  57. f_same.write(target_dir+"目录中----"+file_name+"----已经存在,移动"+file+"失败\r\n")
  58. else:
  59. shutil.move(file,target_path)
  60. time.sleep(0.1)
  61. else:
  62. print(file,"not exist")
  63. f_fail.write(file+"----不存在\r\n")
  64. print(file+"----不存在\r\n")
  65. time.sleep(0.5)
  66. print("程序执行完毕,3秒后退出")
  67. time.sleep(3)

  

把程序打成exe

找到此文件

下面是测试过程

把此exe程序放入0512这个目录下。执行的时候他会查找每个目录下的子目录和文件。并统一放入新创建的all_files目录中。

同时记录excel表移动之前的路径信息。

同名文件不会移动,继续保持原来的路径

假如youku目录下也有个hehe.rtf文件,那么正常来说0512目录下或者0512\youku目录下,有一个hehe.ref文件不会被移动过去。但是会记录重名文件信息.log中

开始执行(记得关闭杀毒软件)

执行完毕,多了3个文件。一个excel表记录原文件路径的,2个日志文件

查看重名文件信息日志

此文件没被移动

其它目录下都空了

(尴尬)此exe程序也被移动过去了,这点有点不足(把自己移动过去了)。后期优化下吧

看一下excel表,第一列是原文件目录名,第二列是此文件名。转码之后可以通过excel表路径信息把文件再移动回去

python找递归目录中文件,并移动到一个单独文件夹中,同时记录原始文件路径信息的更多相关文章

  1. 在VS中让一个JS文件智能提示另一个JS文件中的成员

    “在VS中如何让一个JS文件智能提示另一个JS文件中的成员” 有时候会有这种情况:当我的一个Web页面引用了两个JS文件(假如分别叫common.js和JScript1.js),如果JScript1. ...

  2. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  3. linux面试题:删除一个目录下的所有文件,但保留一个指定文件

    面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10 十个文件 [root@oldboy xx]# touch ...

  4. Linux:删除一个目录下的所有文件,但保留一个指定文件

    面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10  十个文件 [root@oldboy xx]# touc ...

  5. 在VS中让一个JS文件智能提示另一个JS文件中的成员2--具体引用

    我们知道,在html中,利用<script language="javascript" type="text/javascript" src=" ...

  6. [原创]VBA实现汇总excel,将多个Excel文件内容复制到一个Excel文件中

    功能:遍历用户指定的文件夹,把文件夹中所有的excel文件的第一个表格的数据复制到本excel文件中.注意,每个excel文件中有效数据行的判断标准是A列的最后一个有数据的单元格的行号,比如A列到第1 ...

  7. Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit

    以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 採用方法: 第一步.改动C文件 1 ...

  8. c++ 一个cpp文件如何调用另一个cpp文件已经定义的类?我不想重复定义

    文件test1.cpp有类class A;文件test2.cpp有类class B.如在test2.cpp中想用A:#include "test1.cpp" 当然一般的做法是将类的 ...

  9. 用Python删除本地目录下某一时间点之前创建的文件

    参考http://www.cnblogs.com/iderek/p/8035757.html os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前 ...

随机推荐

  1. PotPlayer安装与配置

    目录 1.简介 2.安装 3.设置 基本选项设置: 播放选项设置: PotPlayer皮肤设置: 1.简介 PotPlayer一款小巧简单的视频播放软件,具有于强大的定制能力和个性化功能. 2.安装 ...

  2. npm 升降级

    npm 降级 $ npm -v 6.4.1 $ sudo npm install npm@4 -g /usr/bin/npm -> /usr/lib/node_modules/npm/bin/n ...

  3. Javascript 智能输入数字且保留小数点后三位

    html: <input type="text" name="cprice" placeholder="最多保留小数点后三位" onk ...

  4. Javascript时间戳和日期时间的相互转换

    跟后台对接的时候经常碰到时间格式的问题,有时返回的是时间戳,有时返回的是具体时间,需求又需要它们之间的转换,所以干脆把之前遇到过的情况都给记录下来,以供自己参考! 本文备注:(时间戳单位为毫秒ms,换 ...

  5. Shiro集成web环境[Springboot]-认证与授权

    Shiro集成web环境[Springboot]--认证与授权 在登录页面提交登陆数据后,发起请求也被ShiroFilter拦截,状态码为302 <form action="${pag ...

  6. 第8天【文件系统挂载、ext文件系统及read命令、Linux RAID、lvm应用】

    文件系统挂载与管理工具(01)_recv 文件系统管理: 将额外文件系统与根文件系统某现存的目录建立关联关系,进而使得此目录作为其他文件访问入口的行成为挂载: 解除此关联关系的过程 吧设备关联挂载点: ...

  7. Python 同一文件中,有unittest不执行“if __name__ == '__main__”,不生成HTMLTestRunner测试报告的解决方案

    1.问题:Python中同一个.py文件中同时用unittest框架和HtmlReport框架后,HtmlReport不被执行. 2.为什么?其实不是HtmlReport不被执行,也不是HtmlRep ...

  8. js 浏览器 宽高 各种

    常用: JS 获取浏览器窗口大小   // 获取窗口宽度   if (window.innerWidth)   winWidth = window.innerWidth;   else if ((do ...

  9. 跟随我在oracle学习php(5)

    框架(把一个页面引入当前页面 易维护 扩展 复用)<iframe src=”” frameborder=“”> 格式:iframe <frameset> <frame&g ...

  10. Jumpserver跳板机的搭建和部署

    1.需要搭云yum仓库wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 2. ...