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通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Python设计模式之代理模式简单示例
Jan 09 Python
python使用tkinter实现简单计算器
Jan 30 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
Python地图绘制实操详解
Mar 04 Python
我就是这样学习Python中的列表
Jun 02 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
Python Selenium操作Cookie的实例方法
Feb 28 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
php IP及IP段进行访问限制的代码
2008/12/17 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python实现多行注释的另类方法
2014/08/22 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
手机促销活动方案
2014/02/05 职场文书
文艺晚会主持词
2014/03/24 职场文书
社区服务活动总结
2014/05/07 职场文书
入党综合考察材料
2014/06/02 职场文书
2014个人年度工作总结
2014/12/15 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
大学同学聚会感言
2015/07/30 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python