python复制文件代码实现


Posted in Python onDecember 23, 2013

主要功能在copyFiles()函数里实现,如下:

def copyFiles(src, dst):
    srcFiles = os.listdir(src)
    dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))
    filesCopiedNum = 0    # 对源文件夹中的每个文件若不存在于目的文件夹则复制
    for file in srcFiles:
        src_path = os.path.join(src, file)
        dst_path = os.path.join(dst, file)
        # 若源路径为文件夹,若存在于目标文件夹,则递归调用本函数;否则先创建再递归。
        if os.path.isdir(src_path):
            if not os.path.isdir(dst_path):
                os.makedirs(dst_path)  
            filesCopiedNum += copyFiles(src_path, dst_path)
        # 若源路径为文件,不重复则复制,否则无操作。
        elif os.path.isfile(src_path):                
            if not dstFiles.has_key(file):
                shutil.copyfile(src_path, dst_path)
                filesCopiedNum += 1
    return filesCopiedNum

这里我首先使用os.listdir()函数来遍历源文件夹src和目标文件夹dst,得到两个文件列表,但由于我需要判重操作,因此需要在dst文件列表中进行查询操作。由于列表的查询效率不高,而字典是一个哈希表,查询效率较高,因此我将目标文件列表转换成一个只有键没有值的字典:

dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))

然后我遍历源文件列表,若该路径是一个文件夹,先判断该文件夹在目标路径中是否存在,若不存在,则先创建一个新路径。然后递归调用本函数。其实不存在的时候更高效的方法是调用shutil.copytree()函数,但由于此处需要计算拷贝的文件数量,因此就没有调用该函数。

若该路径是一个文件,则首先判断该文件在目标文件夹中是否存在。若不存在,则拷贝。

由于写这个脚本主要是为了同步手机相册到PC,因此只简单地判断一下文件名。若要判断不同名但相同的文件,则可以继续判断一下md5值,这里就不再赘述。

完整代码如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 输入两个文件夹a和b路径,将a中的文件拷进b,并计算拷贝的文件数。重复的不作处理。
import os
import shutil
def copyFiles(src, dst):
    srcFiles = os.listdir(src)
    dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))
    filesCopiedNum = 0
    # 对源文件夹中的每个文件若不存在于目的文件夹则复制
    for file in srcFiles:
        src_path = os.path.join(src, file)
        dst_path = os.path.join(dst, file)
        # 若源路径为文件夹,若存在于目标文件夹,则递归调用本函数;否则先创建再递归。
        if os.path.isdir(src_path):
            if not os.path.isdir(dst_path):
                os.makedirs(dst_path)  
            filesCopiedNum += copyFiles(src_path, dst_path)
        # 若源路径为文件,不重复则复制,否则无操作。
        elif os.path.isfile(src_path):                
            if not dstFiles.has_key(file):
                shutil.copyfile(src_path, dst_path)
                filesCopiedNum += 1
    return filesCopiedNum
def test():
    src_dir = os.path.abspath(raw_input('Please enter the source path: '))
    if not os.path.isdir(src_dir):
        print 'Error: source folder does not exist!'
        return 0
    dst_dir = os.path.abspath(raw_input('Please enter the destination path: '))
    if os.path.isdir(dst_dir):
        num = copyFiles(src_dir, dst_dir)
    else:
        print 'Destination folder does not exist, a new one will be created.'
        os.makedirs(dst_dir)
        num = copyFiles(src_dir, dst_dir)
    print 'Copy complete:', num, 'files copied.'
if __name__ == '__main__':
    test()
Python 相关文章推荐
Python模块包中__init__.py文件功能分析
Jun 14 Python
深入解析Python中的上下文管理器
Jun 28 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
创建pycharm的自定义python模板方法
May 23 Python
浅谈Python基础—判断和循环
Mar 22 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
python数据类型可变不可变知识点总结
Mar 06 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
Python3 如何开启自带http服务
May 18 Python
如何在python中实现ECDSA你知道吗
Nov 23 Python
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 #Python
videocapture库制作python视频高速传输程序
Dec 23 #Python
天翼开放平台免费短信验证码接口使用实例
Dec 18 #Python
python模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 #Python
python抓取京东商城手机列表url实例代码
Dec 18 #Python
python获取糗百图片代码实例
Dec 18 #Python
python算法学习之计数排序实例
Dec 18 #Python
You might like
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
php长字符串定义方法
2012/07/12 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
使用python为mysql实现restful接口
2018/01/05 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
Javascript如何发送一个Ajax请求
2015/01/26 面试题
幼儿园教师请假制度
2014/01/16 职场文书
银行内勤岗位职责
2014/04/09 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
Redis 常见使用场景
2021/08/30 Redis
Python Django获取URL中的数据详解
2021/11/01 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript