Python寫的一個收集文件的小程序

import os
import shutil
import re

class CollectFile:
    def __init__(self, source, dest, types, explict=None):
        self.source = source 
        self.types = tuple(types)
        self.dest = dest
        self.explict = tuple(explict)
        self.explict = '|'.join(explict)
            
    def _move(self, arg, dirname, fnames):
        if re.search(self.explict, dirname):
            return
        for fname in fnames:
            if fname.endswith(self.types):
                src = dirname+'\\'+fname
                shutil.move(src, self.dest) 

    def _copy(self, arg, dirname, fnames):
        if re.search(self.explict, dirname):
            return
        for fname in fnames:
            if fname.endswith(self.types):
                src = dirname+'\\'+fname
                shutil.copy(src, self.dest) 

    def run(self, method):
        if method == 'move':
            os.path.walk(self.source, self._move, None)
        elif method == 'copy':
            os.path.walk(self.source, self._copy, None)
        else:
            raise TypeError('function --run-- parameter wrong')

if __name__ == '__main__':
    print '''
        Collect File program
        Author:p1usj4de
        Notice:Mutiple input split with blank
    '''
    
    source_dir = raw_input('source dir(default d:\\):')
    dest_dir = raw_input('dest dir(default source dir):')
    method = raw_input('you want to \'move\' or \'copy\'(default move)?')
    types = raw_input('types (default movies):')
    explict_dirs = raw_input('explict dirs(default movie,media and lin):')

    if source_dir == '':
        source_dir = 'd:\\'

    if types != '':
        types = types.split(' ')
    else:
        types = ('mp4', 'avi', 'rmvb', 'wmv')

    if dest_dir == '':
        dest_dir = source_dir

    if explict_dirs == '':
        explict_dirs = ('movie','media','lin')
    else:
        explict_dirs = explict_dirs.split(' ')

    if method == '':
        method = 'move'
        
    cf = CollectFile(source_dir, dest_dir, types=types, explict=explict_dirs)
    cf.run(method)


沒啥難點的,主要就是調用os.path.walk和shutil模塊。其中值得注意的就是shutil.copyfile的dest必須是文件名,而copy的dest可以是文件夾。另外在自定義的文件遍歷函數中,def _move(self, arg, dirname, fnames)中dirname是不帶最後的斜槓的,也就是說要表達source的話必須寫成,dirname+'\\'+fname。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章