Python – 文件拷贝

最近在备份手机上的照片的时候,纯手工操作觉得有些麻烦,就想写个脚本自动进行。因为备份的时候有些照片以前备份过了,所以需要有个判重操作。

主要功能在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()函数,但由于此处需要计算拷贝的文件数量,因此就没有调用该函数。

立即学习“Python免费学习笔记(深入)”;

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

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

#!/usr/bin/env python# -*- coding: UTF-8 -*-  # 输入两个文件夹a和b路径,将a中的文件拷进b,并计算拷贝的文件数。重复的不作处理。# pythontab.com 2013-07-19import osimport 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()

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2283652.html

(0)
上一篇 2025年2月27日 20:17:31
下一篇 2025年2月19日 13:11:16

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python之装饰器详解

    装饰器的语法以@开头,接着是装饰器函数的名字、可选参数。 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_args) def func(func_args):   …. 立即…

    编程技术 2025年2月27日
    200
  • Python列表类型的所有方法

    列表类型有很多方法,这里是列表类型的所有方法: list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x] 。 list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a…

    编程技术 2025年2月27日
    200
  • Python – 命名规范

    一,包名、模块名、局部变量名、函数名 全小写+下划线式驼峰 example:this_is_var 二,全局变量 全大写+下划线式驼峰 立即学习“Python免费学习笔记(深入)”; example:GLOBAL_VAR 三,类名 首字母大…

    编程技术 2025年2月27日
    200
  • python之列表拷贝

    我们需要拷贝一个列表的话,可以用一个特殊的方法,今天给大家说下。 我先定义一个列表 a=[1,2,34] 然后我通过内置方法id()来查看对象的地址 print id(a) 立即学习“Python免费学习笔记(深入)”; 对象地址:1148…

    编程技术 2025年2月27日
    200
  • 强大的zip

    一、代码引导 首先看这一段代码: >>> name=(‘jack’,’beginman’,’sony’,’pcky’)>>> age=(2001,2003,2005,2000)>>> f…

    编程技术 2025年2月27日
    200
  • filter, lambda 函数表达式

    filter(function or none, sequence),其中sequence 可以是list ,tuple,string。这个函数的功能是过滤出sequence 中所有以元素自身作为参数调用function时返回true或bo…

    编程技术 2025年2月27日
    200
  • 字符串格式化 (%操作符)

    在许多编程语言中都包含有格式化字符串的功能,比如c和fortran语言中的格式化输入输出。在python中内置有对字符串进行格式化的操作符是”%”。 模板 格式化字符串时,Python使用一个字符串作为模板。模板中有…

    编程技术 2025年2月27日
    200
  • 元组转字典

    元组:1.使用中括号(())包裹,不可以被更改(尽管他们的内容可以),元组可以看成是 只读 的列表 A. dict.fromkeys(S) S是一个列表或元组… 将S中的元素作为字典的key,value默认为None,也可以指定…

    编程技术 2025年2月27日
    200
  • python基础一

    关于内存分配问题 新定义字符串变量默认新开辟一块新的内存空间 其它类似有索引如列表,元组或是字典赋值时其实只是把变量名指向同一地址空间而已,如下所示 1 ##字符串新定义则开辟新的一块内存空间 2 >>> str1 = &…

    编程技术 2025年2月27日
    200
  • Python基础学习代码之序列

    str1 = ‘abced’for i in range(-1, -len(str1), -1) + [None]:    print str1[:i]s, t = ‘abc’, ‘def’print zip(s, t)for i, t i…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论