前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 目录复制类 脚本

python 目录复制类 脚本

作者头像
用户5760343
发布2022-05-13 10:58:19
4760
发布2022-05-13 10:58:19
举报
文章被收录于专栏:sktj

""" Use: "python ...\Tools\visitor_cpall.py fromDir toDir trace?" Like System\Filetools\cpall.py, but with the visitor classes and os.walk; does string replacement of fromDir with toDir at the front of all the names that the walker passes in; assumes that the toDir does not exist initially; """

import os from visitor import FileVisitor # visitor is in '.' from PP4E.System.Filetools.cpall import copyfile # PP4E is in a dir on path

class CpallVisitor(FileVisitor): def init(self, fromDir, toDir, trace=True): self.fromDirLen = len(fromDir) + 1 self.toDir = toDir FileVisitor.init(self, trace=trace)

代码语言:javascript
复制
def visitdir(self, dirpath):
    toPath = os.path.join(self.toDir, dirpath[self.fromDirLen:])
    if self.trace: print('d', dirpath, '=>', toPath)
    os.mkdir(toPath)
    self.dcount += 1

def visitfile(self, filepath):
    toPath = os.path.join(self.toDir, filepath[self.fromDirLen:])
    if self.trace: print('f', filepath, '=>', toPath)
    copyfile(filepath, toPath)
    self.fcount += 1

if name == 'main': import sys, time fromDir, toDir = sys.argv[1:3] trace = len(sys.argv) > 3 print('Copying...') start = time.clock() walker = CpallVisitor(fromDir, toDir, trace) walker.run(startDir=fromDir) print('Copied', walker.fcount, 'files,', walker.dcount, 'directories', end=' ') print('in', time.clock() - start, 'seconds')


""" #################################################################################### Test: "python ...\Tools\visitor.py dir testmask [string]". Uses classes and subclasses to wrap some of the details of os.walk call usage to walk and search; testmask is an integer bitmask with 1 bit per available self-test; see also: visitor_*/.py subclasses use cases; frameworks should generally use__X pseudo private names, but all names here are exported for use in subclasses and clients; redefine reset to support multiple independent walks that require subclass updates; #################################################################################### """

import os, sys

class FileVisitor: """ Visits all nondirectory files below startDir (default '.'); override visit* methods to provide custom file/dir handlers; context arg/attribute is optional subclass-specific state; trace switch: 0 is silent, 1 is directories, 2 adds files """ def init(self, context=None, trace=2): self.fcount = 0 self.dcount = 0 self.context = context self.trace = trace

代码语言:javascript
复制
def run(self, startDir=os.curdir, reset=True):
    if reset: self.reset()
    for (thisDir, dirsHere, filesHere) in os.walk(startDir):
        self.visitdir(thisDir)
        for fname in filesHere:                          # for non-dir files
            fpath = os.path.join(thisDir, fname)         # fnames have no path
            self.visitfile(fpath)

def reset(self):                                         # to reuse walker
    self.fcount = self.dcount = 0                        # for independent walks

def visitdir(self, dirpath):                             # called for each dir
    self.dcount += 1                                     # override or extend me
    if self.trace > 0: print(dirpath, '...')

def visitfile(self, filepath):                           # called for each file
    self.fcount += 1                                     # override or extend me
    if self.trace > 1: print(self.fcount, '=>', filepath)

class SearchVisitor(FileVisitor): """ Search files at and below startDir for a string; subclass: redefine visitmatch, extension lists, candidate as needed; subclasses can use testexts to specify file types to search (but can also redefine candidate to use mimetypes for text content: see ahead) """

代码语言:javascript
复制
skipexts = []
testexts = ['.txt', '.py', '.pyw', '.html', '.c', '.h']  # search these exts

skipexts = ['.gif', '.jpg', '.pyc', '.o', '.a', '.exe'] # or skip these exts

代码语言:javascript
复制
def __init__(self, searchkey, trace=2):
    FileVisitor.__init__(self, searchkey, trace)
    self.scount = 0

def reset(self):                                         # on independent walks
    self.scount = 0

def candidate(self, fname):                              # redef for mimetypes
    ext = os.path.splitext(fname)[1]
    if self.testexts:
        return ext in self.testexts                      # in test list
    else:                                                # or not in skip list
        return ext not in self.skipexts
     
def visitfile(self, fname):                              # test for a match
    FileVisitor.visitfile(self, fname)
    if not self.candidate(fname):
        if self.trace > 0: print('Skipping', fname)
    else:
        text = open(fname).read()                        # 'rb' if undecodable
        if self.context in text:                         # or text.find() != -1
            self.visitmatch(fname, text)
            self.scount += 1

def visitmatch(self, fname, text):                       # process a match
    print('%s has %s' % (fname, self.context))           # override me lower

if name == 'main': # self-test logic dolist = 1 dosearch = 2 # 3=do list and search donext = 4 # when next test added

代码语言:javascript
复制
def selftest(testmask):
    if testmask & dolist:
       visitor = FileVisitor(trace=2)
       visitor.run(sys.argv[2])
       print('Visited %d files and %d dirs' % (visitor.fcount, visitor.dcount))

    if testmask & dosearch:
       visitor = SearchVisitor(sys.argv[3], trace=0)
       visitor.run(sys.argv[2])
       print('Found in %d files, visited %d' % (visitor.scount, visitor.fcount))

selftest(int(sys.argv[1]))    # e.g., 3 = dolist | dosearch
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • skipexts = ['.gif', '.jpg', '.pyc', '.o', '.a', '.exe'] # or skip these exts
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档