视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python-文件拷贝
2020-11-27 14:28:08 责编:小采
文档


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

主要功能在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,并计算拷贝的文件数。重复的不作处理。
# pythontab.com 2013-07-19
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()

下载本文
显示全文
专题