python 디 렉 터 리 복 제 를 위 한 세 가지 소결

복사 디 렉 터 리:다 층 서브 디 렉 터 리 포함
방법:재 귀,깊이 옮 겨 다 니 기,넓이 옮 겨 다 니 기
깊이 스 트 리밍&넓이 스 트 리밍:
생각:
1.원본 디 렉 터 리 하위 디 렉 터 리 를 가 져 오고 대상 디 렉 터 리 의 하위 경로 설정
1.1 여기 서 두 개의 스 택(또는 대기 열)을 만 들 고 원래 디 렉 터 리 와 대상 디 렉 터 리 를 각각 스 택(또는 대기 열)에 추가 합 니 다.보통 append 로 추가 합 니 다.스 택 의 맨 위,대기 열의 뒷부분 에 추가 합 니 다.
1.2 깊이 는 스 택 의 상단 에서 원 경 로 를 꺼 내 판단 하 는 동시에 같은 방식 으로 대상 경 로 를 꺼 낼 수 있 습 니 다(스 택 과 대기 열 은 모두 list 와 유사 하 며 list 로 실현 할 수 있 습 니 다)
대기 열 앞에서 원 경 로 를 꺼 내 판단 하 는 동시에 같은 방식 으로 목표 경 로 를 꺼 냅 니 다.
2.원자 급 경로 가 파일 인지 판단
2.1 대상 하위 파일 이 존재 하지 않 거나 대상 하위 파일 이 존재 하지만 하위 파일 크기 가 일치 하지 않 으 면 복사
3.원자 급 디 렉 터 리 가 디 렉 터 리 인지 판단
3.1.재 귀적 으로 자신 을 호출 하고 자신의 하위 디 렉 터 리 를 원본 파일 로 삼 아 대상 하위 디 렉 터 리 로 복사 합 니 다.
3.2 깊이 를 옮 겨 다 니 며 원본 디 렉 터 리 와 대상 디 렉 터 리 를 스 택(대기 열)뒤에 추가 합 니 다.'

#          (          )
#     
import os, collections
 
def copyDir(sourcePath,targetPath):
  #      ,           
  #              ,        
  if not os.path.isdir(sourcePath):
    return '      '
  #      ,           ,                
  sourceStack = collections.deque()
  sourceStack.append(sourcePath)
 
  targetStack = collections.deque()
  targetStack.append(targetPath)
  #                  
  while True:
    if len(sourceStack) == 0:
      break
    #           
    sourcePath = sourceStack.pop() #sourcePath = sourceStack.popleft()
    #                
    listName = os.listdir(sourcePath)
 
    #         
    targetPath = targetStack.pop() #targetPath = targetStack.popleft()
    #            ,        
    if not os.path.isdir(targetPath):
      os.makedirs(targetPath)
    #               ,     ,    
    for name in listName:
      #       
      sourceAbs = os.path.join(sourcePath, name)
      targetAbs = os.path.join(targetPath, name)
      #        
      if os.path.isdir(sourceAbs):
        #           ,          
        if not os.path.exists(targetAbs):
          os.makedirs(targetAbs)
        #             
        sourceStack.append(sourceAbs)
        targetStack.append(targetAbs)
      #        
      if os.path.isfile(sourceAbs):
        # 1.                                            
        if (not os.path.exists(targetAbs)) or (os.path.exists(targetAbs) and os.path.getsize(targetAbs) != os.path.getsize(targetAbs)):
          rf = open(sourceAbs, mode='rb')
          wf = open(targetAbs, mode='wb')
          while True:
            #       ,              
            content = rf.read(1024*1024*10)
            if len(content) == 0:
              break
            wf.write(content)
            #              ,       
            wf.flush()
          #         
          rf.close()
          wf.close()
#                     
sPath = ""
tPath = ""
copyDir(sPath,tPath)
반복:
귀속 사고:
1.함 수 를 정의 하여 디 렉 터 리 를 복사 하려 면 원본 디 렉 터 리 와 대상 디 렉 터 리 로 전송 해 야 합 니 다.
2.원본 디 렉 터 리 가 하나의 디 렉 터 리 인지 아 닌 지 판단-아니면 종료
3.대상 디 렉 터 리 의 존재 여부-존재 하지 않 음,새로 만 들 기
4.원본 디 렉 터 리 를 옮 겨 다 니 며,

 
import os
 
 
def copyDir(sourceDir,targetDir):
 
  if not os.path.isdir(sourceDir):
 
    return "      "
 
  if not os.path.exists(targetDir):
 
    os.makedirs(targetDir)
 
  listName = os.listdir(sourceDir)
 
  for name in listName:
 
    sourceAbs = os.path.join(sourceDir,name)
 
    targetAbs = os.path.join(targetDir,name)
 
  if os.path.isdir(sourceAbs):
 
    #      
 
    if not os.path.exists(targetAbs):
 
      os.makedirs(targetAbs)
 
    copyDir(sourceAbs,targetAbs)
 
  if os.path.isfile(sourceAbs):
 
  # 1.                                             
 
    if (not os.path.exists(targetAbs)) or (os.path.exists(targetAbs) and os.path.getsize(targetAbs) != os.path.getsize(sourceAbs)):
 
      rf = open(sourceAbs,mode="rb")
 
      wf = open(targetAbs,mode="wb")
 
      while True:
 
        content = rf.read(1024*1024*10)
 
        if len(content) == 0:
 
          break
 
        wf.write(content)
 
        wf.flush()
 
        rf.close()
 
        wf.close()
 
#   
 
sPath = ""
 
tPath = ""
 
copyDir(sPath,tPath)
이상 의 python 이 디 렉 터 리 복 제 를 실현 하 는 세 가지 소결 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기