python实现文件(夹)剪切
自己的需求是这样的:
有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实现文件(夹)剪切相关推荐
- Python创建目录文件夹
Python创建目录文件夹 Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建. 主要涉及到三个函数 1.os.path.exists(path) 判断一个目 ...
- python ftp文件夹文件递归上传推送
python ftp文件夹文件递归上传推送 posted on 2018-10-16 17:05 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnbl ...
- python列出文件夹最新的几个文件_Python列出一个文件夹及其子目录的所有文件
python简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl ...
- python查找文件夹下的文件,python 查找文件夹下所有文件 实现代码 -电脑资料
复制代码代码如下: def find_file_by_pattern(pattern='.*', base=".", circle=True): '''''查找给定文件夹下面所有 ...
- Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略
Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略 目录 Python与文件夹那些事 1.创建/删除文件/文件夹 1.创建文件夹
- python检测文件夹中新增文件_python检测文件夹变化,并拷贝有更新的文件到对应目录的方法...
检测文件夹,拷贝有更新的文件到对应目录 2016.5.19 亲测可用,若有借鉴请修改下文件路径: 学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~ newcopy.py: ...
- python 复制文件夹内容 并结构一致_Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法...
本文实例讲述了Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法.分享给大家供大家参考.具体如下: 这个东东本来是做来给公司数据同步用的:新服务器还没正式启用,旧的服务器还在使用,每天都 ...
- Python列出文件夹下某类文件名的方法
Python 列出文件夹下某类文件后缀 读某个文件夹下所有图片 利用os.listdir()和string.endswith()函数实现. 在进行视觉相关任务编程时, 常常需要读出文件夹下的图片.但有 ...
- python获取文件夹里有什么文件+查看特定格式的文件
python获取文件夹里有什么文件+查看特定格式的文件 功能 程序 效果 后续 功能 获取文件夹的的文件+获取文件夹里的特定格式的文件,比如.png等 程序 import os folder = r& ...
最新文章
- 大合集!80 篇 CVPR2020 论文分方向整理: 目标检测/图像分割/姿态估计等(附链接&下载)...
- 使用控件时提示“未声明标识符“的解决方法
- Java 中的多线程你只要看这一篇就够了
- 1736: 反射-含某个字符的子串的查找
- Retrofit的简单使用
- 十字连接焊盘_你应该知道的焊盘基础知识
- Linux内核热补丁方案对比
- 计算机及网络维护工程师专业问题
- Fastjson源码阅读:缺陷静态检查(上)
- 阿里云个人银行卡四要素验证接口
- 在自己的APP或网页中调用高德地图网页版
- mqdf python_GitHub - jugg1024/court_recognition
- 深入理解Nginx 读书笔记
- windows系统查看sn编码
- 2020李宏毅机器学习笔记-Convolution Netural Network
- CS和IP寄存器的作用及执行分析
- 操作系统中消费者与生产者的同步互斥问题
- Kitty: 又一款基于 GPU 加速的终端工具
- Mybatis框架Result Maps解析
- 虚拟化平台安装并升级显卡驱动
热门文章
- 少女时代动态android,少女时代攻「V APP」!连续8天live直播大放送
- 国密学习笔记 对称密码算法
- “跨境电商EBC”概念正式亮相
- WebUI自动化框架 - 数据驱动(ddt、paramunittest)
- 【python 程序题:火车票购买程序】
- 基于JAVA网上图书销售系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
- DC-DC 保护调试经验
- MIFARE Classic S50技术详解
- 一个体育生的编程之路(一)
- 计算机硬技术与基础在线测试,计算机硬件技术基础网上作业及答案