国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python復制文件代碼實現

2019-11-25 18:35:22
字體:
來源:轉載
供稿:網友

主要功能在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()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永和县| 和静县| 廊坊市| 滕州市| 改则县| 如东县| 泗阳县| 西充县| 治多县| 三原县| 广南县| 潮州市| 海南省| 邯郸市| 陵水| 阿合奇县| 柳河县| 西乌珠穆沁旗| 禹城市| 宁国市| 唐山市| 长岛县| 永胜县| 苏尼特左旗| 永和县| 大丰市| 濮阳县| 会理县| 芒康县| 棋牌| 托克逊县| 津南区| 太原市| 米泉市| 济源市| 凌源市| 长泰县| 通海县| 龙岩市| 南昌县| 万载县|