[파이썬] 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/' >>>