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的Flask框架中实现简单的登录功能的教程
Apr 20 Python
浅析Python中将单词首字母大写的capitalize()方法
May 18 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
Python的语言类型(详解)
Jun 24 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
python datetime时间格式的相互转换问题
Jun 11 Python
Python类成员继承重写的实现
Sep 16 Python
python openCV自制绘画板
Oct 27 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 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 实现的将图片转换为TXT
2015/10/21 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
js 获取、清空input type="file"的值(示例代码)
2013/12/24 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
Python程序中的观察者模式结构编写示例
2016/05/27 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
使用python进行拆分大文件的方法
2018/12/10 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
什么是反射?如何实现反射?
2016/07/25 面试题
商务英语专业毕业生自荐信
2013/11/05 职场文书
董事长秘书职责
2014/01/31 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
人事任命书范本
2015/09/21 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL