My Project/CCTV(Python)

3. Python(파이썬)으로 파일을 외부 드라이브로 옮기기

코딩 잘 할거얌:) 2021. 8. 3. 01:56
반응형

앞서 포스팅에서 CCTV Usecase를 작성해보았다. 이제는 Python으로 파일을 옮기는 작업과, 그다음 포스팅에는 RTSP protocol을 이용하여 영상을 받아오고 저장해보겠다.

내 맘속에 저장

혹시 파이썬 개발환경을 구축하지 못한 분들은 다른곳에 포스팅한 글을 보고 따라하시면 됩니다.

https://pcseob.tistory.com/11

 

1. 윈도우에서 파이썬 개발환경 구축하기 (파이참, 아나콘다)

코딩 시작하기 전 가장 힘든 것 중 하나가 개발환경 구축이라고 해도 과언이 아니다. 개발환경 구축을 몇 번 해본 사람들은 알겠지만, 게임이나 일반 응용프로그램처럼. exe파일을 실행한다고 해

pcseob.tistory.com

Python으로 파일을 옮기는 과정을 하는 이유는, RTSP로 받아온 영상파일을 라즈베리파이에 저장을 해도 된다. 하지만 용량이 부족할 경우가 생길 수 있으므로, 라즈베리파이에 연결된 외부 저장장치로 파일을 옮겨서 저장하도록 하자.

 


Python으로 파일을 옮겨보자.

https://stackoverflow.com/questions/8858008/how-to-move-a-file-in-python

 

How to move a file in Python?

I looked into the Python os interface, but was unable to locate a method to move a file. How would I do the equivalent of $ mv ... in Python? >>> source_files = '/PATH/TO/FOLDER/*' >&g...

stackoverflow.com

아주 간단하다. 다양한 방법이 있지만 shutil을 import하여 파일을 옮겨보도록 하겠다.

  import shutil
  filename = 'moveTest.txt'
  src = 'C:/Users/Users/Desktop/'
  dir = 'F:/test/'
  shutil.move(src + filename, dir + filename)

  # src와 dir에 slash는 ?키에 있는 /이다 \와 혼동하지않도록 주의하자.

이렇게 하면 간단하게 파일이 옮겨진다.

간혹 import os를 사용하여 옮기는데 에러가 뜨는 경우가 있다. os에 있는 rename과 replace는 동일한 드라이브에서 옮길 때 가능하다.

  import os

  filename = 'moveTest.txt'
  src = "C:/Users/Users/Desktop/"
  dir = "C:/Users/Users/Desktop/새 폴더/"

  os.replace(src + filename, dir + filename)
  # os.rename(src + filename, dir + filename)

  #OS를 이용하여 파일을 옮길경우, 동일한 드라이브에서 이동해야한다.
  #Drive간 이동을 할 때 Copy Paste한 후 delete하는 과정이므로 shutil.move를 사용해야한다.

따라서 내가 원하는 건 외부드라이브에 옮겨야 하므로 Shutil.move를 사용하기로 한다.

 

이제 예외처리를 해주자.

 

만약에 shutil을 사용하여 옮기는데 옮긴 장소에 동일한 이름의 파일이 존재한다면 어떻게 될까? 따로 해본 결과, 에러가 발생하지는 않지만 기존에 가지고 있던 파일이 자동으로 덮어씌워진다. 이 경우는 기존에 있던 파일이 어떤 건지 확인할 방법이 없으므로 Windows에서 동일한 파일이 있을 때 처리하는 방식대로 처리할 것이다.

나머지 예외발생하는 경우에는 프로그램이 강제 종료만 되지 않도록 try except로 처리를 한다.

 

동일한 파일이 존재하는지 확인을 해야한다.

  import os

  filename = 'moveTest.txt'
  src = "C:/Users/Users/Desktop/"
  dir = "F:/test/"

  print(os.path.isfile(dir))
  #파일이 존재한다면 True, 파일이 존재하지 않는다면 False를 반환한다.

자 이제 모두 정리해서 하나의 코드로 만들자.

import shutil
import os

filename = 'moveTest'
fileFormat = '.txt'
src = "C:/Users/Users/Desktop/"
destination = "F:/test/"

try:
	
    isCurrentPathFileExist = os.path.isfile(src + filename + fileFormat)
    #현재경로에 옮기려는 파일이 존재하는지 확인
    isDestinationFileExist = os.path.isfile(destination + filename + fileFormat)
    #도착경로에 동일한 파일이 존재하는지 확인
    if isCurrentPathFileExist:
    	#도착경로에 동일한 파일이 존재하지 않는 경우에는 옮긴다.
        if not isDestinationFileExist:
            shutil.move(src + filename + fileFormat, destination + filename + fileFormat)
        #도착경로에 동일한 파일이 존재하는 경우
        else:
            i = 1
            while True:
                if os.path.isfile(destination + filename + " ({})".format(i) + fileFormat):
                    i += 1
                else:
                    break
            shutil.move(src + filename + fileFormat, destination + filename + " ({})".format(i) + fileFormat)

except Exception as e:
    print(e)
# 모든 예외의 상위에 존재하는 Exception으로 나머지 에러들을 잡아준다.
# 다만 이 경우는 디버깅을 할 때 에러난 위치를 찾기가 힘들 수 있으므로, 디버깅할때는 빼주는 것이 좋다.

 

 

간단하죠?

 


오류, 지적사항 그리고 궁금한 것은 댓글 부탁드립니다.

 

 

 

 

728x90