[파이썬] python 파일&디렉토리(폴더) 복사(copy) 및 삭제 방법 : shutil , os

[파이썬] python 파일&디렉토리(폴더) 복사(copy) 및 삭제 방법 : shutil , os

파이썬 언어에서 파일과 디렉토리를 삭제하는 방법에 대해 알아봅니다.

shutil 모듈을 import 하여 사용하면 쉽게 처리할 수 있습니다. 

파일 및 디렉토리에 접근하기 위해 os모듈도 함께 import 해야합니다.

rmtree()함수를 사용하여 폴더를 삭제하는 경우 폴더(디렉토리)안에 파일도 함께 모두 삭제처리합니다. 

아래 코드 스니펫은 test폴더 안에 파일과 폴더를 임시로 생성 후 일괄 삭제 처리를 해보았습니다. 

파이썬 파일 및 디렉토리(폴더)를 무조건 동시에 삭제 처리 하는 방법

import shutil
import os

print('-'*20)
file_list = os.listdir("C:/python/test")
print(file_list)
print('-'*20)
 

shutil.rmtree("C:/python/test")
file_list = os.listdir("C:/python/test")
print(file_list)



#실행결과
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py
--------------------
['folder_1', 'newfile.txt', 'sample.txt', '새파일.txt']
--------------------
Traceback (most recent call last):
  File "C:\python\Workspace\main.py", line 10, in <module>
    file_list = os.listdir("C:/python/test")
FileNotFoundError: [WinError 3] 지정된 경로를 찾을 수 없습니다: 'C:/python/test'

삭제완료 후 이미 삭제된 리스트를 print문으로 찍으려고 하니 “지정된 경로를 찾을 수 없습니다” 라는 오류가 노출됩니다. 삭제가 잘 되었다는 뜻이지요.

파이썬 파일만 삭제하는 방법

os.remove()함수를 사용하여 처리합니다.

os.splitext()함수를 사용하면 확장자가를 지정하여 해당 확장자를 가진 모든 파일의 삭제가 가능합니다.

import os

print('-'*30)
file_list = os.listdir("C:/python/test/folder1")
print(file_list)
print('-'*30)

os.remove("C:/python/test/folder1/java_logo.png")
file_list = os.listdir("C:/python/test/folder1")
print(file_list)\



#실행결과
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py
------------------------------
['android_logo.png', 'kotlin_logo.png', 'newfile.txt', 'python_logo.png', 'sample.txt', 'xbox_logo.png']
------------------------------
Traceback (most recent call last):
  File "C:\python\Workspace\main.py", line 8, in <module>
    os.remove("C:/python/test/folder1/java_logo.png")
FileNotFoundError: [WinError 2] 지정된 파일을 찾을 수 없습니다: 'C:/python/test/folder1/java_logo.png'

Process finished with exit code 1

다음은 확장자가 png인 모든 파일을 삭제하는 예제 코드입니다. 

splitex()함수를 사용하여 파일명과 확장자를 분리 후 확장자를 기준으로 조건문을 만들고 삭제대상이 된다면 join()함수를 사용하여 파일경로와 파일명을 연결합니니다.

그리고 난후 remove()함수를 사용하여 삭제를 진행합니다. 

실행결과 삭제 후 모든 png파일은 삭제되고 txt파일만 남아 있음을 확인할 수 있습니다.

import os

print('-'*30)
file_list = os.listdir("C:/python/test/folder1")
print(file_list)
print('-'*30)

for file in file_list:
    filename, file_extension = os.path.splitext(file)
    print("파일명 :", file, "      확장자 :", file_extension)
    if file_extension == '.png':
        file_path = os.path.join("C:/python/test/folder1", file)
        print("파일경로와파일명 조합 :", file_path)
        os.remove(file_path)


print('-'*30)
file_list = os.listdir("C:/python/test/folder1")
print(file_list)
print('-'*30)



#실행결과
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py
------------------------------
['android_logo.png', 'kotlin_logo.png', 'newfile.txt', 'python_logo.png', 'sample.txt', 'xbox_logo.png']
------------------------------
파일명 : android_logo.png       확장자 : .png
파일경로와파일명 조합 : C:/python/test/folder1\android_logo.png
파일명 : kotlin_logo.png       확장자 : .png
파일경로와파일명 조합 : C:/python/test/folder1\kotlin_logo.png
파일명 : newfile.txt       확장자 : .txt
파일명 : python_logo.png       확장자 : .png
파일경로와파일명 조합 : C:/python/test/folder1\python_logo.png
파일명 : sample.txt       확장자 : .txt
파일명 : xbox_logo.png       확장자 : .png
파일경로와파일명 조합 : C:/python/test/folder1\xbox_logo.png
------------------------------
['newfile.txt', 'sample.txt']
------------------------------

Process finished with exit code 0

*.png는 먹히지 않네요.

os.remove("C:/python/test/folder1/*.png")


#실행결과
  File "C:\python\Workspace\main.py", line 8, in <module>
    os.remove("C:/python/test/folder1/*.png")
OSError: [WinError 123] 파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다:
'C:/python/test/folder1/*.png'

파이썬 디렉토리만 삭제하는 방법

os.removedirs()함수를 사용하거나 os.rmdir()함수를 사용하여 처리합니다.

단, 예외 사항이 있습니다. 디렉토리에 파일이 존재하는 경우 삭제되지않고 오류가 발생합니다.

import os

print('-'*30)
file_list = os.listdir("C:/python/test/folder1")
print(file_list)
print('-'*30)

os.removedirs("C:/python/test/folder1")
#os.rmdir("C:/python/test/folder2")




#실행결과
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py
------------------------------
['android_logo.png', 'java_logo.png', 'kotlin_logo.png', 'newfile.txt', 'python_logo.png', 'sample.txt', 'xbox_logo.png']
------------------------------
Traceback (most recent call last):
  File "C:\python\Workspace\main.py", line 8, in <module>
    os.removedirs("C:/python/test/folder1")
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\os.py", line 243, in removedirs
    rmdir(name)
OSError: [WinError 145] 디렉터리가 비어 있지 않습니다: 'C:/python/test/folder1'

파이썬 디렉토리 및 파일 전체를 복사하는 방법

shutil.copytree()함수를 사용하여 디렉토리(Directory)안에 있는 파일(file)과 디렉토리를 모두 포함하여 복사합니다. 

import shutil

path = os.path.dirname("C:\python/")

#python폴더 전체를 python2로 복사하기
shutil.copytree("C:\python/", "C:\python2/")

#실행결과
'C:\\python2/'

#리스트 조회
os.listdir("C:\python2/")

#실행결과
['script', 'test', 'test_Bak - 복사본', 'Workspace', '새파일.txt']

동일한 경로로 복사를 시도하는 경우 오류가 발생합니다. : 파일이 이미 있으므로 만들 수 없습니다.

즉, 이미 폴더가 존재하면 오류가 발생합니다. 그럼으로 디렉토리 생성과 동시에 파일을 복사할때 사용하여야 합니다.

>>> shutil.copytree("C:\python/", "C:\python2/")


#실행결과
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 554, in copytree
    return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 455, in _copytree
    os.makedirs(dst, exist_ok=dirs_exist_ok)
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\os.py", line 225, in makedirs
    mkdir(name, mode)
FileExistsError: [WinError 183] 파일이 이미 있으므로 만들 수 없습니다: 'C:\\python2/'
>>>

파이썬 디렉토리 및 파일 전체를 일괄 삭제하는 방법

디렉토리 및 파일 전체를 일괄 삭제하는 방법은 shutil.rmtree()함수를 사용합니다.

import shutil

path = os.path.dirname("C:\python/2")
 
#리스트 조회
os.listdir("C:\python2/")

#실행결과
['script', 'test', 'test_Bak - 복사본', 'Workspace', '새파일.txt']


shutil.rmtree("C:\python2/")

삭제 완료 후 다시한번 실행하면 오류가 발생됩니다. : 지정된 경로를 찾을 수 없습니다

>>> 
>>> shutil.rmtree("C:\python2/")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 737, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 596, in _rmtree_unsafe
    onerror(os.scandir, path, sys.exc_info())
  File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 593, in _rmtree_unsafe
    with os.scandir(path) as scandir_it:
FileNotFoundError: [WinError 3] 지정된 경로를 찾을 수 없습니다: 'C:\\python2/'
>>>

https://www.naragara.com/%ed%8c%8c%ec%9d%b4%ec%8d%ac-python-%ed%8c%8c%ec%9d%bc-%ec%83%9d%ec%84%b1-%eb%b0%8f-%ec%9d%bd%ea%b8%b0-%ec%93%b0%ea%b8%b0i-o-%ed%95%98%eb%8a%94-%eb%b0%a9%eb%b2%95-read-readlines-open-clo/

카테고리의 다른 글
error: Content is protected !!