Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Python
Code

파이썬을 이용한 파일 및 디렉터리 작업

by
Difficulty:IntermediateLength:ShortLanguages:

Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)

이전 튜토리얼에서는 파일을 읽고, 열고, 닫고, 쓰는 방법에 대해 설명했습니다. 이번 튜토리얼에서는 파일과 디렉터리(폴더)에서 수행할 수 있는 다양한 작업에 대해 좀 더 알아보겠습니다.

여러분도 아시다시피 우리는 파일을 많이 사용하고, 파일을 처리하는 것에는 단순히 파일을 열거나 닫는 것 말고도 많습니다. 특정 파일을 몇 번이나 복사했는지 기억하십니까? 아니면 어떤 웹 사이트에서 내려받은 파일의 이름이 무의미한 것이어서 이름을 변경한 경우는 기억하십니까? 이번 튜토리얼에서 이러한 유형의 작업에 대해 살펴보려고 합니다.

준비되셨나요? 그럼 본론으로 들어가서 파이썬을 이용해 파일과 디렉터리로 흥미로운 작업을 시작해 보겠습니다.

shutil

shutil(셸 유틸리티)은 이번 튜토리얼에서 파일 및 디렉터리 작업을 수행하는 데 사용할 모듈의 이름입니다. shutil은 이미 파이썬 배포판에 포함돼 있으므로 직접 설치할 필요가 없습니다. 이 모듈을 사용하려면 모듈을 import하기만 하면 됩니다.

import shutil

파일 복사하기

첫 번째 작업인 파일 복사부터 시작해 봅시다. 파일을 복사하기 위해 shutil 모듈의 copy() 함수를 사용할 것입니다. 이 튜토리얼의 예제에서는 sample.pdf이라는 파일을 사용하겠습니다. 이 파일을 다운로드하거나 원하는 아무 파일이나 자유롭게 사용해도 됩니다.

다음의 간단한 스크립트는 sample.pdf를 바탕화면(원래 위치한 곳)에서 다른 디렉터리인 Temp(바탕화면에도 있음)로 복사하는 방법을 보여줍니다.

여기서는 터미널에서 바탕화면을 현재 경로로 사용하고 있기 때문에 스크립트에는 파일명과 디렉터리명만 나열했습니다. 그 대신 복사하려는 파일과 파일을 복사할 디렉터리의 전체 경로를 지정해도 됩니다. 예제의 경우에는 다음과 같습니다.

Temp 디렉터리나 지정한 디렉터리를 열면 복사된 파일을 볼 수 있을 것입니다!

그런데 두 번째 인수가 디렉터리가 아닌 파일이면 어떻게 될까요? 즉, 다음과 같이 입력했다고 가정해 봅시다(두 파일이 모두 바탕화면에 있다고 가정하고 파일의 전체 경로를 제거했습니다).

이 경우 원본 파일인 sample.pdf의 복사본인 file.pdf라는 새 파일이 만들어집니다. 따라서 file.pdf를 열면 실제로 sample.pdf의 사본이기 때문에 내용이 동일하다는 것을 알 수 있습니다.

원본과 대상이 같을 수도 있을까요? 한번 시험해 봅시다.

shutil.copy('sample.pdf', 'sample.pdf')

파일명이 같아서는 안 되기 때문에 이 작업을 수행하면 오류가 발생하는 듯합니다.

디렉터리 복사하기

이번 절에서는 이전 절에서 살펴봤듯이 파일 하나가 아닌 전체 디렉터리(폴더)를 복사하는 방법을 살펴보겠습니다.

복사하려는 디렉터리의 구조가 다음과 같다고 가정해 봅시다. 즉, Original이라는 디렉터리가 있고, 이 디렉터리에는 Original-1이라는 디렉터리가 있고, 이 디렉터리에는 Original-2 디렉터리가 있고, 이 디렉터리에는 Original-3이라는 디렉터리가 있고, Original-3에는 Sample.pdf 파일이 들어있습니다(휴...).

A visualization of what its like to copy directories in Python

지금 하려는 것은 Original 디렉터리와 그것의 모든 내용을 새로운 디렉터리에 복사하고 새로운 디렉터리의 이름을 Original-Copy라고 지정하는 것입니다.

이 작업은 다음과 같이 copytree() 함수를 이용해 간단히 수행할 수 있습니다(바탕화면에서 모든 작업이 일어난다고 가정).

이제 Original의 모든 내용과 구조를 똑같이 가진 Original-Copy 디렉터리가 새로 생긴 것을 확인할 수 있습니다.

파일 이동하기

파일 이동은 파일을 대상으로 잘라서 붙여넣는 작업을 수행하는 것과 같습니다. '파일 복사하기' 절에서 원본 파일을 원래 위치에 그대로 두면서 파일의 복사본을 만드는 방법을 살펴봤습니다.

이번 절에서는 파일을 원래 위치에서 제거함과 동시에 파일을 새 위치로 옮기는(잘라내기) 방법을 살펴보겠습니다. 이 작업은 다음과 같이 move() 함수를 이용해 간단히 수행됩니다.

Sample.pdfTemp 디렉터리로 옮겨졌으며, 더는 바탕화면에 존재하지 않습니다.

그럼 다음과 같이 Sample.pdf를 새 파일New-Sample.pdf로 옮기면 어떻게 될까요?

이 경우 Sample.pdf와 동일한 내용의 New-Sample.pdf만 만들어지고 Sample.pdf는 더는 존재하지 않습니다.

디렉터리 이동하기

디렉터리를 옮기는 것은 '파일 이동하기' 절에서 사용한 것과 동일한 함수인 move()를 이용해 수행됩니다. '디렉터리 복사하기' 절에서 사용한 것과 같은 예제를 사용하되 이번에는 move() 함수를 사용해 봅시다.

이 경우 Original과 내용이 같은 Original-Copy 디렉터리가 새로 만들어지지만 Original은 더 이상 존재하지 않습니다.

파일과 디렉터리의 이름 바꾸기

그거 아시나요? 파일이나 디렉터리의 이름을 바꾸는 데도 move() 함수를 사용할 수 있습니다. 이번 절에서는 예제를 반복해서 설명하지 않겠습니다. 그런데 위의 파일과 디렉터리 모두에 move() 함수를 적용할 경우 기존 파일/디렉터리는 더 이상 존재하지 않지만 내용이 같은 새로운 파일/디렉터리가 만들어진다고 언급한 바 있습니다. 이것은 파일/디렉터리의 이름을 변경하는 것과 같습니다. 그렇지 않나요?

파일과 디렉터리 삭제하기

shutil 모듈에는 파일을 삭제하는 기능이 포함돼 있지 않은 듯합니다. 그러나 디렉터리를 삭제하는 함수인 rmtree()는 분명 포함돼 있습니다. 삭제는 되돌릴 수 없기 때문에 삭제된 디렉터리를 휴지통에서 찾을 수 없을 테니 주의하세요.

다음 예제는 Original-Copy 디렉터리를 영구적으로 삭제하는 방법을 보여줍니다.

파일을 영구적으로 삭제하려면 다음과 같이 파이썬의 os 모듈에 있는 remove() 함수를 사용하면 됩니다.

결론

보다시피 파일과 디렉터리에 대한 중요한 작업(복사, 이동, 이름 바꾸기, 삭제)을 shutilos 모듈을 통해 아주 쉽게 수행할 수있었습니다. 이러한 모듈의 문서를 참조하면 해당 모듈로 수행할 수 있는 작업에 대한 자세한 정보를 확인할 수 있습니다.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.