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