본문 바로가기
GD's IT Lectures : 기초부터 시리즈/파이썬(Python) 기초부터 ~

[파이썬(PYTHON) : 중급] 파일과 디렉토리 처리

by GDNGY 2023. 5. 10.

5. 파일과 디렉토리 처리

파일과 디렉토리 처리에서는 os, shutil, glob, pathlib 모듈을 활용하여 파일 및 디렉토리 조작을 수행하는 방법을 학습합니다. 파일 및 폴더 생성, 복사, 이동, 삭제 등 다양한 작업을 효율적으로 수행할 수 있는 기술을 익히게 됩니다.

 

5.1. os 모듈

os 모듈은 운영 체제와 상호 작용할 수 있는 수많은 함수를 제공합니다. 이 모듈을 사용하면 파일이나 디렉토리를 생성, 제거하거나, 파일의 정보를 조회하거나, 현재 작업 디렉토리를 변경하는 등의 작업을 수행할 수 있습니다.

 

5.1.1. 파일 및 디렉토리 경로 처리

파일과 디렉토리의 경로를 처리하는 것은 파일 시스템 작업의 기본적인 부분입니다.

 

5.1.1.1. 절대 경로와 상대 경로

파일이나 디렉토리의 위치를 지정하는 방법에는 두 가지가 있습니다: 절대 경로와 상대 경로입니다.

 

절대 경로는 파일 시스템의 루트부터 시작하는 파일이나 디렉토리의 전체 경로입니다. 반면에 상대 경로는 현재 디렉토리를 기준으로 파일이나 디렉토리의 위치를 나타냅니다.

 

파이썬에서는 os.path 모듈을 사용하여 절대 경로와 상대 경로를 다룰 수 있습니다.

import os

# 절대 경로
abs_path = "/home/user/Documents/file.txt"
print(os.path.isabs(abs_path))  # 출력: True

# 상대 경로
rel_path = "Documents/file.txt"
print(os.path.isabs(rel_path))  # 출력: False

 

5.1.1.2. 경로명 분리 및 결합

파일이나 디렉토리의 경로를 분리하거나 결합할 수 있습니다. 이는 os.path.split 함수와 os.path.join 함수를 사용하여 수행할 수 있습니다.

import os

path = "/home/user/Documents/file.txt"

# 경로 분리
head, tail = os.path.split(path)
print(head)  # 출력: /home/user/Documents
print(tail)  # 출력: file.txt

# 경로 결합
new_path = os.path.join(head, "new_file.txt")
print(new_path)  # 출력: /home/user/Documents/new_file.txt

 

5.1.1.3. 경로명 확장

파일 경로에 확장자나 사용자 홈 디렉토리와 같은 특수 문자를 포함하는 경우, 이를 실제 값으로 변환해야 할 때가 있습니다. 이는 os.path.expanduser 함수와 os.path.splitext 함수를 사용하여 수행할 수 있습니다.

import os

# 사용자 홈 디렉토리 확장
path = "~/Documents/file.txt"
full_path = os.path.expanduser(path)
print(full_path)  # 출력: /home/user/Documents/file.txt

# 파일 확장자 분리
root, ext = os.path.splitext(full_path)
print(root)  # 출력: /home/user/Documents/file
print(ext)  # 출력: .txt

 

5.1.2. 디렉토리 생성 및 제거

파이썬에서는 os 모듈을 사용하여 디렉토리를 생성하고 제거할 수 있습니다.

 

5.1.2.1. 단일 디렉토리 생성

os.mkdir 함수를 사용하여 단일 디렉토리를 생성할 수 있습니다.

import os

os.mkdir("new_directory")

 

이 코드는 현재 작업 디렉토리에 "new_directory"라는 이름의 새 디렉토리를 생성합니다.

 

5.1.2.2. 재귀적 디렉토리 생성

os.makedirs 함수를 사용하여 하위 디렉토리를 포함하는 전체 디렉토리 경로를 생성할 수 있습니다.

import os

os.makedirs("new_directory/subdirectory")

 

이 코드는 "new_directory"라는 이름의 새 디렉토리와 그 안에 "subdirectory"라는 하위 디렉토리를 함께 생성합니다.

 

5.1.2.3. 디렉토리 제거

os.rmdir 함수를 사용하여 디렉토리를 제거할 수 있습니다. 이 함수는 디렉토리가 비어 있을 때만 작동합니다.

import os

os.rmdir("new_directory/subdirectory")
os.rmdir("new_directory")

 

이 코드는 먼저 "subdirectory"를 제거한 다음, 그 상위 디렉토리인 "new_directory"를 제거합니다.

 

5.1.3. 파일 생성, 이름 변경 및 제거

파이썬에서는 파일을 생성, 이름 변경, 제거하는 다양한 방법이 있습니다.

 

5.1.3.1. 파일 생성

파일을 생성하는 가장 간단한 방법은 open 함수를 사용하여 새 파일을 열고 그것을 다시 닫는 것입니다.

open("new_file.txt", "w").close()

 

이 코드는 "new_file.txt"라는 이름의 새 파일을 생성합니다. "w" 모드는 파일이 이미 존재하는 경우 내용을 삭제하고 새 파일을 생성합니다.

 

5.1.3.2. 파일 이름 변경

파일의 이름을 변경하려면 os.rename 함수를 사용할 수 있습니다.

import os

os.rename("new_file.txt", "renamed_file.txt")

 

이 코드는 "new_file.txt"라는 파일의 이름을 "renamed_file.txt"로 변경합니다.

 

5.1.3.3. 파일 제거

파일을 제거하려면 os.remove 함수를 사용할 수 있습니다.

import os

os.remove("renamed_file.txt")

 

이 코드는 "renamed_file.txt"라는 파일을 제거합니다.

 

5.1.4. 파일 정보 조회

파이썬에서는 os.path 모듈을 사용하여 다양한 파일 정보를 조회할 수 있습니다.

 

5.1.4.1. 파일 존재 확인

파일이 존재하는지 확인하려면 os.path.exists 함수를 사용할 수 있습니다.

 

import os

if os.path.exists("file.txt"):
    print("파일이 존재합니다.")
else:
    print("파일이 존재하지 않습니다.")

 

5.1.4.2. 파일 타입 확인

파일이 디렉토리인지, 일반 파일인지, 또는 씸볼릭 링크인지 확인하려면 os.path 모듈의 isdir, isfile, islink 함수를 사용할 수 있습니다.

import os

path = "/path/to/something"

if os.path.isdir(path):
    print("디렉토리입니다.")
elif os.path.isfile(path):
    print("일반 파일입니다.")
elif os.path.islink(path):
    print("심볼릭 링크입니다.")

 

5.1.4.3. 파일 크기 조회

파일의 크기를 바이트 단위로 조회하려면 os.path.getsize 함수를 사용할 수 있습니다.

import os

file_size = os.path.getsize("file.txt")
print(f"파일 크기: {file_size} 바이트")

 

5.1.5. 현재 작업 디렉토리 변경

파이썬에서 현재 작업 디렉토리를 확인하거나 변경하는 것은 간단합니다.

 

5.1.5.1. 현재 작업 디렉토리 확인

현재 작업 디렉토리를 확인하려면 os.getcwd 함수를 사용할 수 있습니다.

import os

cwd = os.getcwd()
print(f"현재 작업 디렉토리: {cwd}")

 

5.1.5.2. 작업 디렉토리 변경

작업 디렉토리를 변경하려면 os.chdir 함수를 사용할 수 있습니다.

import os

os.chdir("/path/to/directory")

cwd = os.getcwd()
print(f"현재 작업 디렉토리: {cwd}")

 

이 코드는 작업 디렉토리를 "/path/to/directory"로 변경하고, 변경된 작업 디렉토리를 출력합니다.

 

이렇게 os 모듈을 사용하여 파이썬에서 파일과 디렉토리를 쉽게 다룰 수 있습니다. os 모듈은 파일 시스템을 조작하는 데 필요한 거의 모든 기능을 제공하므로, 이 모듈에 익숙해지는 것은 파일과 디렉토리를 다루는 파이썬 프로그램을 작성하는 데 매우 유용합니다.

 

 

5.2. shutil 모듈

shutil 모듈은 파일 및 디렉토리 복사, 이동, 삭제와 같은 고수준의 파일 연산을 포함하고 있습니다. 이 모듈을 사용하면, 운영 체제에 관계없이 파일 및 디렉토리를 쉽게 다룰 수 있습니다.

 

5.2.1. 파일 및 디렉토리 복사

파일 및 디렉토리 복사는 shutil 모듈의 core 기능 중 하나입니다. 이를 위해 shutil.copy()와 shutil.copy2() 함수를 사용할 수 있습니다.

 

5.2.1.1. 단일 파일 복사

import shutil

shutil.copy('source.txt', 'destination.txt')  # source.txt를 destination.txt로 복사

 

이 코드는 'source.txt' 파일을 'destination.txt'로 복사합니다. 만약 'destination.txt'가 이미 존재한다면 덮어쓰게 됩니다. shutil.copy()는 메타데이터를 복사하지 않고, 파일 내용만 복사합니다.

 

5.2.1.2. 디렉토리 복사

디렉토리를 복사하기 위해서는 shutil.copytree() 함수를 사용합니다.

import shutil

shutil.copytree('source_directory', 'destination_directory')  # source_directory를 destination_directory로 복사

 

이 코드는 'source_directory'의 모든 파일과 하위 디렉토리를 'destination_directory'로 복사합니다. 'destination_directory'가 이미 존재하면 오류가 발생합니다.

 

5.2.2. 디렉토리 트리 복사 및 제거

디렉토리 트리의 복사 및 제거도 shutil 모듈을 사용하면 쉽게 할 수 있습니다.

 

5.2.2.1. 디렉토리 트리 복사

디렉토리 트리 복사는 위에서 설명한 shutil.copytree() 함수를 사용하여 수행됩니다.

 

5.2.2.2. 디렉토리 트리 제거

디렉토리 트리 제거는 shutil.rmtree() 함수를 사용합니다.

import shutil

shutil.rmtree('directory')  # directory와 그 하위의 모든 파일 및 디렉토리를 삭제

 

이 코드는 'directory'와 그 하위의 모든 파일 및 디렉토리를 삭제합니다.

 

5.2.3. 파일 내용 비교
shutil 모듈은 두 파일의 내용이 동일한지 비교하는 기능도 제공합니다.

 

5.2.3.1. 두 파일의 동일성 확인

import shutil

is_same = shutil.cmp('file1.txt', 'file2.txt')  # file1.txt와 file2.txt의 내용이 동일한지 확인
print(is_same)  # 내용이

 

동일하면 True, 아니면 False를 출력합니다.

 

5.2.4. 디스크 사용량 조회

shutil 모듈은 디스크 사용량을 조회하는 기능도 제공합니다.

 

5.2.4.1. 전체 디스크 사용량 확인

import shutil

total, used, free = shutil.disk_usage("/")  # 전체, 사용 중, 사용 가능한 디스크 용량 확인

print(f"Total: {total // (2**30)} GiB")
print(f"Used: {used // (2**30)} GiB")
print(f"Free: {free // (2**30)} GiB")

 

이 코드는 루트 디렉토리("/")의 디스크 사용량을 조회합니다. 결과는 바이트 단위로 반환되므로, 보기 좋게 GiB 단위로 변환하여 출력했습니다.

 

5.2.4.2. 특정 디렉토리/파일의 디스크 사용량 확인

특정 디렉토리나 파일의 사용량을 확인하려면 os 모듈의 os.path.getsize() 함수를 사용합니다.

import os

size = os.path.getsize("test.txt")  # test.txt의 크기 확인
print(f"Size: {size // (2**10)} KiB")

 

이 코드는 'test.txt' 파일의 크기를 확인합니다. 결과는 바이트 단위로 반환되므로, 보기 좋게 KiB 단위로 변환하여 출력했습니다.

 

shutil 모듈은 이 외에도 파일 이동, 파일 이름 변경 등 다양한 파일 및 디렉토리 연산을 제공합니다.

 

5.3. glob 모듈

Python의 glob 모듈은 디렉토리 와일드카드 검색을 지원하여 파일 리스트를 쉽게 얻을 수 있습니다.

 

5.3.1. 와일드카드를 이용한 파일 목록 조회

와일드카드는 특정 패턴에 일치하는 파일명을 찾는 데 사용되는 문자입니다. '*'와 '?'가 일반적으로 사용됩니다.

 

5.3.1.1. 단일 와일드카드 사용
'*' 와일드카드를 사용하면 임의의 문자열에 대응됩니다.

import glob

files = glob.glob('*.txt')  # 현재 디렉토리의 모든 .txt 파일 조회
print(files)

 

이 코드는 현재 디렉토리에서 확장자가 '.txt'인 모든 파일을 찾아 리스트로 반환합니다.

 

5.3.1.2. 다중 와일드카드 사용

여러 와일드카드를 조합하여 사용할 수 있습니다.

files = glob.glob('*[0-9].*')  # 숫자를 포함하는 모든 파일 조회
print(files)

 

이 코드는 파일명에 숫자를 포함하는 모든 파일을 찾습니다.

 

5.3.2. 재귀적 파일 목록 조회

glob 함수에 '**'를 사용하면 모든 하위 디렉토리를 포함하여 검색할 수 있습니다.

 

5.3.2.1. 하위 디렉토리 파일 조회

files = glob.glob('**/*.txt', recursive=True)  # 모든 하위 디렉토리의 .txt 파일 조회
print(files)

 

이 코드는 모든 하위 디렉토리에서 확장자가 '.txt'인 모든 파일을 찾습니다.

 

5.3.2.2. 특정 패턴의 하위 디렉토리 파일 조회

files = glob.glob('**/*test*.txt', recursive=True)  # 모든 하위 디렉토리의 'test'를 포함하는 .txt 파일 조회
print(files)

 

이 코드는 모든 하위 디렉토리에서 'test'라는 문자열을 포함하고 확장자가 '.txt'인 모든 파일을 찾습니다.

 

5.3.3. 경로명 패턴 활용

정규식을 활용해 복잡한 패턴의 파일을 검색할 수 있습니다.

 

5.3.3.1. 정규식을 활용한 파일 검색

import re

files = glob.glob('**/*.txt', recursive=True)  # 모든 하위 디렉토리의 .txt 파일 조회
pattern = re.compile(r'test\d+\.txt')  # 'test' 다음에 숫자가 오는 .txt 파일 패턴

matches = [file for file in files if pattern.match(file)]  # 패턴에 맞는 파일 조회
print(matches)

 

위 코드는 모든 하위 디렉토리에서 파일명이 'test'로 시작하고 그다음에 숫자가 오며, 확장자가 '.txt'인 모든 파일을 찾습니다.

 

5.3.3.2. 다양한 패턴을 사용한 파일 검색

여러 조건을 결합한 복잡한 패턴으로 파일을 검색할 수 있습니다.

files = glob.glob('**/*.txt', recursive=True)  # 모든 하위 디렉토리의 .txt 파일 조회
pattern = re.compile(r'(test|sample)\d*\.txt')  # 'test' 또는 'sample'으로 시작하고 그 다음에 숫자가 올 수도 있는 .txt 파일 패턴

matches = [file for file in files if pattern.match(file)]  # 패턴에 맞는 파일 조회
print(matches)

 

위 코드는 모든 하위 디렉토리에서 파일명이 'test' 또는 'sample'로 시작하고 그다음에 숫자가 올 수도 있으며, 확장자가 '.txt'인 모든 파일을 찾습니다. 

 

glob 모듈은 파일 시스템을 검색하는 간단한 방법을 제공합니다. 와일드카드와 정규 표현식을 사용하여 다양한 패턴에 맞는 파일을 쉽게 찾을 수 있습니다. 디렉토리 구조가 복잡하거나, 특정 패턴의 파일을 찾아야 할 때 유용하게 사용될 수 있습니다.

 

5.4. pathlib 모듈

pathlib 모듈은 객체 지향적 방식으로 파일 시스템 경로를 처리하는 데 사용됩니다. 이 모듈은 파일 시스템 경로를 쉽게 생성, 조회, 조작할 수 있는 편리한 방법을 제공하며, 다양한 운영 체제에서 동일하게 작동합니다.

 

5.4.1. 경로 객체 생성 및 조작

파일 시스템의 경로를 표현하는 데 사용되는 주요 클래스는 Path입니다.

 

5.4.1.1. 경로 객체 생성

Path 클래스를 사용하여 경로 객체를 생성할 수 있습니다.

from pathlib import Path

# 현재 작업 디렉토리를 나타내는 경로 객체 생성
p = Path('.')
print(p)  # 출력: .

# 절대 경로를 나타내는 경로 객체 생성
p = Path('/usr/local/bin')
print(p)  # 출력: /usr/local/bin

# 상대 경로를 나타내는 경로 객체 생성
p = Path('../..')
print(p)  # 출력: ../..

 

5.4.1.2. 경로 구성요소 조회

Path 객체의 속성과 메서드를 사용하여 경로의 다양한 구성요소를 조회할 수 있습니다.

p = Path('/usr/local/bin/python3')

print(p.parts)  # 출력: ('/', 'usr', 'local', 'bin', 'python3')
print(p.parent)  # 출력: /usr/local/bin
print(p.name)  # 출력: python3
print(p.stem)  # 출력: python3
print(p.suffix)  # 출력: 
print(p.root)  # 출력: /

 

5.4.1.3. 경로명 변경 및 확장

Path 객체는 경로명을 변경하거나 확장하는 메서드를 제공합니다.

p = Path('/usr/local/bin/python3')

# 경로명 변경
p_new = p.with_name('python3.7')
print(p_new)  # 출력: /usr/local/bin/python3.7

# 확장자 추가
p_new = p.with_suffix('.py')
print(p_new)  # 출력: /usr/local/bin/python3.py

 

5.4.2. 파일 및 디렉토리 정보 조회

Path 객체는 파일이나 디렉토리에 대한 다양한 정보를 조회하는 메서드를 제공합니다.

 

5.4.2.1. 파일 존재 확인

exists() 메서드를 사용하여 파일이나 디렉토리가 존재하는지 확인할 수 있습니다.

p = Path('test.txt')

if p.exists():
    print(f'{p} exists')
else:
    print(f'{p} does not exist')

 

5.4.2.2. 파일 타입 확인

is_file(), is_dir(), is_symlink() 메서드를 사용하여 파일이나 디렉토리의 타입을 확인할 수 있습니다.

p = Path('test.txt')

if p.is_file():
    print(f'{p} is a file')
elif p.is_dir():
    print(f'{p} is a directory')
elif p.is_symlink():
    print(f'{p} is a symbolic link')
else:
    print(f'{p} does not exist')

 

5.4.2.3. 파일 크기 및 수정 시간 조회

stat() 메서드를 사용하여 파일의 메타데이터, 즉 크기, 수정 시간 등을 조회할 수 있습니다.

p = Path('test.txt')

if p.exists():
    info = p.stat()
    print(f'Size: {info.st_size} bytes')
    print(f'Last modified: {info.st_mtime}')
else:
    print(f'{p} does not exist')

 

5.4.3. 파일 및 디렉토리 생성, 제거

Path 객체는 파일이나 디렉토리를 생성하고 제거하는 메서드를 제공합니다.

 

5.4.3.1. 파일 생성 및 내용 쓰기

write_text() 메서드를 사용하여 파일을 생성하고 내용을 쓸 수 있습니다.

p = Path('test.txt')

p.write_text('Hello, world!')

 

5.4.3.2. 파일 이름 변경 및 제거

rename() 메서드를 사용하여 파일의 이름을 변경할 수 있으며, unlink() 메서드를 사용하여 파일을 제거할 수 있습니다.

p = Path('test.txt')
p_new = Path('test_new.txt')

p.rename(p_new)  # 파일 이름 변경

p_new.unlink()  # 파일 제거

 

5.4.3.3. 디렉토리 생성 및 제거

mkdir() 메서드를 사용하여 디렉토리를 생성할 수 있으며, rmdir() 메서드를 사용하여 디렉토리를 제거할 수 있습니다.

p = Path('testdir')

p.mkdir()  # 디렉토리 생성

p.rmdir()  # 디렉토리 제거

 

5.4.4. 파일 내용 읽기 및 쓰기

Path 객체는 파일의 내용을 읽고 쓰는 메서드를 제공합니다.

 

5.4.4.1. 파일 내용 읽기

read_text() 메서드를 사용하여 파일의 내용을 읽을 수 있습니다.

p = Path('test.txt')

content = p.read_text()
print(content)

 

5.4.4.2. 파일 내용 쓰기

앞서 살펴본 write_text() 메서드를 사용하여 파일에 내용을 쓸 수 있습니다. 이 메서드는 파일이 이미 존재하면 내용을 덮어씁니다.

 

5.4.4.3. 파일 내용 추가하기

open() 메서드와 표준 라이브러리의 write() 함수를 사용하여 파일에 내용을 추가할 수 있습니다.

p = Path('test.txt')

with p.open('a') as f:
f.write('\nHello again, world!')

 

이렇게 `pathlib` 모듈을 이용하면, 간단하고 직관적인 방법으로 파일 및 디렉토리를 처리할 수 있습니다. 이 모듈은 파일 시스템 경로를 다루는 일반적인 작업들을 쉽게 처리하도록 돕기 때문에, 파이썬에서 파일과 디렉토리 작업을 수행할 때 매우 유용합니다.

 

또한, 이 모듈은 파일 시스템 경로를 객체로 처리함으로써 코드를 더 간결하고 가독성 있게 만들어 줍니다. 이는 코드의 유지 보수를 쉽게 하고 버그를 줄이는 데 도움이 됩니다.

 

마지막으로, `pathlib` 모듈은 다양한 운영 체제에서 동일하게 작동하므로, 운영 체제에 상관없이 코드를 작성할 수 있습니다.

 

 

 

2023.05.09 - [GD's IT Lectures : 기초부터 시리즈/파이썬(Python) 기초부터 ~] - [파이썬(PYTHON) : 중급] 모듈과 패키지 고급 활용

 

[파이썬(PYTHON) : 중급] 모듈과 패키지 고급 활용

4. 모듈과 패키지 고급 활용 모듈과 패키지 고급 활용에서는 파이썬 라이브러리를 설치하고 관리하는 방법을 배우며, 유용한 라이브러리를 활용하여 코드를 효율적으로 작성하는 방법을 익힙니

gdngy.tistory.com

 

반응형

댓글