自己的需求是这样的:

有a和b两个目录,a目录下的文件(夹)要剪切到b目录下;我用下面这种形式来表达需求,不然说得比较乱。

需求如下:
a目录1.文件:1)是日志文件:(1)文件大小<20m:跳过(2)日志文件>=20m:复制名加上当天日期,然后剪切到b中(记录到日志文件中)2)不是日志文件:(1)不在b中:直接剪切到b中(记录到日志文件中)(2)在b中:Name = Name + ’_’ ; 然后剪切到b中(记录到日志文件中)2.文件夹:1)文件夹不在b中:直接剪切到b中(记录到日志文件中)2)文件夹在b里面:(1)文件夹内的文件(夹)也在b目录相同文件夹中:命名方式同上:Name = Name + ’_’ ;然后剪切(记录到日志文件中)(2)文件夹内的文件(夹)不在b目录相同文件夹中:直接剪切所有文件(夹)(记录到日志文件中)
b目录1.文件2.文件夹

自己的实现步骤如下:版本一

#coding:utf-8
'''一个剪切脚本版本一:实现递归列出多有文件
'''import os
import shutil
class Shear():def __init__(self):#源目录self.src = "C:\\Users\\LZH\\Documents\\upupoo\\Docker\\config\\文件夹\\python练习\\shear\\a\\"#目标目录self.dest = "C:\\Users\\LZH\\Documents\\upupoo\\Docker\\config\\文件夹\\python练习\\shear\\b\\"def start_shear(self,a_filepath):for a_item in os.listdir(a_filepath):                           #遍历源目录下的所有文件a_absolute_path = os.path.join(a_filepath,a_item)           #新的目录为传入目录+传入目录里面的文件夹名称is_file = os.path.isfile(a_absolute_path)                   #文件赋给 is_fileis_dir = os.path.isdir(a_absolute_path)                     #目录赋给 is_dirif is_file:if a_item =="数据传输日志.log":passelse:print(a_item)elif is_dir:if a_item == "回盘文件":passelif a_item == "已导入数据库":passelse:print("目录为--%s--的有以下文件:"% a_item)shear.start_shear(a_absolute_path)if __name__ == "__main__":shear = Shear()shear.start_shear(shear.src)

版本二

#coding:utf-8
'''一个文件移动脚本版本一:实现递归列出多有文件版本二:实现源目录和目的目录的文件移动
'''import os
import shutil
class Shear():def __init__(self):#源目录self.src = "C:\\Users\\LZH\\Documents\\upupoo\\Docker\\config\\文件夹\\python练习\\shear\\a\\"#目标目录self.dest = "C:\\Users\\LZH\\Documents\\upupoo\\Docker\\config\\文件夹\\python练习\\shear\\b\\"def start_shear(self,a_filepath):for a_item in os.listdir(a_filepath):                             #遍历源目录下的所有文件a_absolute_path = os.path.join(a_filepath,a_item)             #新的目录为传入目录+传入目录里面的文件夹名称is_a_file = os.path.isfile(a_absolute_path)                   #文件赋给 is_fileis_a_dir = os.path.isdir(a_absolute_path)                     #目录赋给 is_dirif is_a_file:                                                 #self.src 里是文件的话处理条件如下:if a_item =="数据传输日志.log":passelif a_item in os.listdir(self.dest):                     #如果该文件已经存在于目的目录中,则不操作renamef = a_item.split('.')                           #将文件名及后缀分开#print(rename)os.rename(self.src+a_item, self.src+renamef[0]+"_."+renamef[1])   #若目的目录存在该目录,则修改名字,后加“_”else:shutil.move(self.src+a_item, self.dest)               #shutil.move(full_path,destpath) 这里移动文件的源文件要完全路径,否则会报找不到文件的错#os.rename(a_item,self.dest)elif is_a_dir:                                                #self.src 里是目录的话处理条件如下:if a_item == "回盘文件备份" or a_item == "已导入数据库":      #目录名为指定目录名时则不操作passelse:#print(a_absolute_path)os.chdir(a_absolute_path)                             #更改目录为src里的每个目录if a_item not in os.listdir(self.dest):               #判断src里面的每一个目录是否在dest里,不在则执行os.makedirs(self.dest+a_item)                     #在dest中创建和src中一样的目录else:mk = self.dest+a_itemfor ch_item in os.listdir(a_absolute_path):       #存在则遍历src中每个目录里的所有文件if ch_item not in os.listdir(mk):             #文件若不在上一次执行创建的目录中,则移动该文件到新创建的目录中if ch_item == "已导入数据库" or ch_item =="回盘文件":  #文件夹中存在该名称目录则跳过 ;否 则移动passelse:shutil.move(ch_item, mk)else:#print("文件已存在,无法移动文件: %s" % ch_item)   #若新创建的目录中已经包含该文件,则提示无法移动if os.path.isdir(self.src+a_item+"\\"+ch_item):     #当目的目录内文件夹有该文件夹时os.rename(self.src + a_item + "\\" + ch_item,self.src + a_item + "\\" + ch_item + "_")#则修改文件名+“_”,在第二次执行中移动文件,若还存在,则重复前面步骤,直至移动到目的目录else:                                               #目录下为文件时则操作如下renamed = ch_item.split('.')os.rename(self.src+a_item+"\\"+ch_item, self.src+a_item+"\\"+renamed[0]+"_."+renamed[1])if __name__ == "__main__":shear = Shear()shear.start_shear(shear.src)

版本三:

#coding:utf-8
'''一个文件移动脚本版本一:实现递归列出多有文件版本二:实现源目录和目的目录的文件移动版本三:实现日志记录及日志备份
'''import os
import shutil
from datetime import datetime
class Shear():def __init__(self):#源目录self.src = "C:\\Users\\LZH\\Documents\\upupoo\\Docker\\config\\文件夹\\python练习\\shear\\a\\"#目标目录self.dest = "C:\\Users\\LZH\\Documents\\upupoo\\Docker\\config\\文件夹\\python练习\\shear\\b\\"'''文件(夹)移动部分'''def start_shear(self,a_filepath):for a_item in os.listdir(a_filepath):                             #遍历源目录下的所有文件a_absolute_path = os.path.join(a_filepath,a_item)             #新的目录为传入目录+传入目录里面的文件夹名称is_a_file = os.path.isfile(a_absolute_path)                   #文件赋给 is_fileis_a_dir = os.path.isdir(a_absolute_path)                     #目录赋给 is_dirif is_a_file:                                                 #self.src 里是文件的话处理条件如下:if a_item == "数据传输日志.log":shear.back_log(self.src+a_item)                       #进入日志文件备份判断程序elif a_item in os.listdir(self.dest):                     #如果该文件已经存在于目的目录中,则不操作renamef = a_item.split('.')                           #将文件名及后缀分开#print(rename)os.rename(self.src+a_item, self.src+renamef[0]+"_."+renamef[1])   #若目的目录存在该目录,则修改名字,后加“_”else:asize = round(os.path.getsize(self.src+a_item)/1024, 2) #os.path.getsize获取文件大小,round()函数取值范围:小数点后两位shutil.move(self.src+a_item, self.dest)                 #shutil.move(full_path,destpath) 这里移动文件的源文件要完全路径,否则会报找不到文件的错shear.log(a_item, self.dest, asize, '源目录中')#os.rename(a_item,self.dest)elif is_a_dir:                                                #self.src 里是目录的话处理条件如下:if a_item == "回盘文件备份" or a_item == "已导入数据库":     #目录名为指定目录名时则不操作passelse:#print(a_absolute_path)os.chdir(a_absolute_path)                             #更改目录为src里的每个目录if a_item not in os.listdir(self.dest):               #判断src里面的每一个目录是否在dest里,不在则执行os.makedirs(self.dest+a_item)                     #在dest中创建和src中一样的目录else:mk = self.dest+a_itemfor ch_item in os.listdir(a_absolute_path):       #存在则遍历src中每个目录里的所有文件if ch_item not in os.listdir(mk):             #文件若不在上一次执行创建的目录中,则移动该文件到新创建的目录中if ch_item == "已导入数据库" or ch_item =="回盘文件":  #文件夹中存在该名称目录则跳过 ;否 则移动passelse:asize = round(os.path.getsize(ch_item)/1024,2)  #os.path.getsize获取文件大小,round()函数取值范围:小数点后两位shutil.move(ch_item, mk)shear.log(ch_item, mk, asize, a_item)else:#print("文件已存在,无法移动文件: %s" % ch_item)       #若新创建的目录中已经包含该文件,则提示无法移动if os.path.isdir(self.src+a_item+"\\"+ch_item):     #当目的目录内文件夹有该文件夹时os.rename(self.src + a_item + "\\" + ch_item,self.src + a_item + "\\" + ch_item + "_")#则修改文件名+“_”,在第二次执行中移动文件,若还存在,则重复前面步骤,直至移动到目的目录else:                                               #目录下为文件时则操作如下renamed = ch_item.split('.')os.rename(self.src+a_item+"\\"+ch_item, self.src+a_item+"\\"+renamed[0]+"_."+renamed[1])'''记录日志部分'''def log(self, data, dest, size, bankname):                                      #文件名;目的目录;大小;银行名称record = open(self.src+"数据传输日志.log", 'a')record.write("%s-*********-" % datetime.now().strftime('%Y-%m-%d : %H:%M')+"来源:%s" % bankname+"\t文件:%s" % data +"\t大小:%sk" % size +"\t移动到:%s" % dest +"\n")'''日志文件备份'''def back_log(self,log_file):log_size = round(os.path.getsize(log_file)/(1024*1024),1)if log_size >= 20:                                                          #若日志文件超过20m,则备份文件shutil.copyfile(self.src+"数据传输日志.log",self.dest+"数据传输日志%s.log" % datetime.now().strftime('%Y-%m-%d') )else:passif __name__ == "__main__":shear = Shear()shear.start_shear(shear.src)

到此为止基本功能都实现了,就是感觉写得挺麻烦的。说说存在的问题

1.假设a目录中既有文件又有文件夹,程序第一次执行只操作了文件,第二次操作才轮到文件夹。这个问题怎么解决好?

2.该程序并没有递归判断b目录中是否也存在相同文件,而是第二层目录后的目录直接剪切到了b目录对应位置,若是存在我用了重命名这个方式来解决,但若是后续有这个需求,程序还需要完善

3.shutil.move()在文件没其他程序占用的时候照样会被剪走,这个我感觉很不好的地方,尝试过用os.rename()。也是没有报错,这个问题有没有更好的解决方式?

python实现文件(夹)剪切相关推荐

  1. Python创建目录文件夹

    Python创建目录文件夹 Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建. 主要涉及到三个函数 1.os.path.exists(path) 判断一个目 ...

  2. python ftp文件夹文件递归上传推送

    python ftp文件夹文件递归上传推送 posted on 2018-10-16 17:05 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnbl ...

  3. python列出文件夹最新的几个文件_Python列出一个文件夹及其子目录的所有文件

    python简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl ...

  4. python查找文件夹下的文件,python 查找文件夹下所有文件 实现代码 -电脑资料

    复制代码代码如下: def find_file_by_pattern(pattern='.*', base=".", circle=True): '''''查找给定文件夹下面所有 ...

  5. Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略

    Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略 目录 Python与文件夹那些事 1.创建/删除文件/文件夹 1.创建文件夹

  6. python检测文件夹中新增文件_python检测文件夹变化,并拷贝有更新的文件到对应目录的方法...

    检测文件夹,拷贝有更新的文件到对应目录 2016.5.19 亲测可用,若有借鉴请修改下文件路径: 学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~ newcopy.py: ...

  7. python 复制文件夹内容 并结构一致_Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法...

    本文实例讲述了Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法.分享给大家供大家参考.具体如下: 这个东东本来是做来给公司数据同步用的:新服务器还没正式启用,旧的服务器还在使用,每天都 ...

  8. Python列出文件夹下某类文件名的方法

    Python 列出文件夹下某类文件后缀 读某个文件夹下所有图片 利用os.listdir()和string.endswith()函数实现. 在进行视觉相关任务编程时, 常常需要读出文件夹下的图片.但有 ...

  9. python获取文件夹里有什么文件+查看特定格式的文件

    python获取文件夹里有什么文件+查看特定格式的文件 功能 程序 效果 后续 功能 获取文件夹的的文件+获取文件夹里的特定格式的文件,比如.png等 程序 import os folder = r& ...

最新文章

  1. 大合集!80 篇 CVPR2020 论文分方向整理: 目标检测/图像分割/姿态估计等(附链接&下载)...
  2. 使用控件时提示“未声明标识符“的解决方法
  3. Java 中的多线程你只要看这一篇就够了
  4. 1736: 反射-含某个字符的子串的查找
  5. Retrofit的简单使用
  6. 十字连接焊盘_你应该知道的焊盘基础知识
  7. Linux内核热补丁方案对比
  8. 计算机及网络维护工程师专业问题
  9. Fastjson源码阅读:缺陷静态检查(上)
  10. 阿里云个人银行卡四要素验证接口
  11. 在自己的APP或网页中调用高德地图网页版
  12. mqdf python_GitHub - jugg1024/court_recognition
  13. 深入理解Nginx 读书笔记
  14. windows系统查看sn编码
  15. 2020李宏毅机器学习笔记-Convolution Netural Network
  16. CS和IP寄存器的作用及执行分析
  17. 操作系统中消费者与生产者的同步互斥问题
  18. Kitty: 又一款基于 GPU 加速的终端工具
  19. Mybatis框架Result Maps解析
  20. 虚拟化平台安装并升级显卡驱动

热门文章

  1. 少女时代动态android,少女时代攻「V APP」!连续8天live直播大放送
  2. 国密学习笔记 对称密码算法
  3. “跨境电商EBC”概念正式亮相
  4. WebUI自动化框架 - 数据驱动(ddt、paramunittest)
  5. 【python 程序题:火车票购买程序】
  6. 基于JAVA网上图书销售系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  7. DC-DC 保护调试经验
  8. MIFARE Classic S50技术详解
  9. 一个体育生的编程之路(一)
  10. 计算机硬技术与基础在线测试,计算机硬件技术基础网上作业及答案