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实现进程间通信简单实例
Jul 23 Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 Python
python字符串与url编码的转换实例
May 10 Python
Python pymongo模块常用操作分析
Sep 01 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python五子棋游戏的设计与实现
Jun 18 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Python中格式化字符串的四种实现
May 26 Python
Python流程控制语句的深入讲解
Jun 15 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 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
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
python中文件变化监控示例(watchdog)
2017/10/16 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
爱护公共设施的标语
2014/06/24 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
毕业生评语大全
2015/01/04 职场文书
上课说话检讨书
2015/01/27 职场文书
导游词开场白
2015/01/31 职场文书
MySQL数据库表约束讲解
2022/06/21 MySQL