python
파이썬으로 디렉토리 내 모든 파일 쉽게 가져오기: 초보자를 위한 안내서

파이썬으로 디렉토리 내 모든 파일 쉽게 가져오기: 초보자를 위한 안내서

MoeNagy Dev

파일 경로 이해하기

절대 경로 vs. 상대 경로

Python에서는 절대 경로와 상대 경로 모두 사용할 수 있습니다. 절대 경로는 파일 또는 디렉토리의 완전하고 명확한 위치를 나타내며 파일 시스템의 루트부터 시작합니다. 반면에 상대 경로는 현재 작업 디렉토리 또는 파일 시스템의 특정 위치를 기준으로 한 경로입니다.

Python에서 절대 경로와 상대 경로를 사용하는 예시입니다:

# 절대 경로
absolute_path = "/Users/username/documents/file.txt"
 
# 상대 경로
relative_path = "documents/file.txt"

os.path.abspath() 함수를 사용하여 상대 경로를 절대 경로로 변환할 수 있습니다:

import os
 
relative_path = "documents/file.txt"
absolute_path = os.path.abspath(relative_path)
print(absolute_path)
# 출력결과: /Users/username/documents/file.txt

Python으로 파일 시스템 탐색하기

Python의 osos.path 모듈은 파일 시스템을 탐색하기 위한 함수들을 제공합니다. 주로 사용되는 몇 가지 함수들은 다음과 같습니다:

  • os.getcwd(): 현재 작업 디렉토리를 반환합니다.
  • os.chdir(path): 현재 작업 디렉토리를 지정된 경로(path)로 변경합니다.
  • os.path.join(path1, path2, ...): 하나 이상의 경로 구성요소를 자동으로 연결합니다.
  • os.path.dirname(path): 지정된 경로의 디렉토리 이름을 반환합니다.
  • os.path.basename(path): 지정된 경로의 기본 이름을 반환합니다.

예시:

import os
 
# 현재 작업 디렉토리 가져오기
current_dir = os.getcwd()
print(current_dir)
 
# 현재 작업 디렉토리 변경
os.chdir("/Users/username/documents")
new_dir = os.getcwd()
print(new_dir)
 
# 경로 연결
file_path = os.path.join(new_dir, "file.txt")
print(file_path)
 
# 디렉토리 이름과 기본 이름 가져오기
dir_name = os.path.dirname(file_path)
base_name = os.path.basename(file_path)
print(dir_name)
print(base_name)

디렉토리 내 파일 목록 가져오기

os.listdir() 함수 사용하기

특정 디렉토리 내 파일과 디렉토리 목록을 가져오기 위해 os.listdir() 함수를 사용할 수 있습니다. 이 함수는 지정된 디렉토리 내 모든 항목(파일과 디렉토리)의 목록을 반환합니다.

예시:

import os
 
# 현재 디렉토리 내 파일과 디렉토리 목록 가져오기
items = os.listdir(".")
print(items)

파일 목록 필터링하기

os.path.isfile()os.path.isdir() 함수를 사용하여 각 항목의 유형을 확인하여 파일과 디렉토리 목록을 필터링할 수 있습니다.

예시:

import os
 
# 현재 디렉토리 내 파일과 디렉토리 목록 가져오기
items = os.listdir(".")
 
# 파일만 가져오기
files = [item for item in items if os.path.isfile(item)]
print(files)
 
# 디렉토리만 가져오기
directories = [item for item in items if os.path.isdir(item)]
print(directories)

하위 디렉토리 처리하기

재귀적으로 하위 디렉토리 탐색하기

디렉토리 내 모든 파일을 가져오기 위해 재귀적 접근법을 사용하여 하위 디렉토리를 탐색할 수 있습니다. 이는 함수나 논리 내에서 동일한 함수 또는 동작을 호출하여 하위 디렉토리를 처리하는 것을 의미합니다.

예시:

import os
 
def get_all_files(directory):
    all_files = []
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            all_files.append(item_path)
        elif os.path.isdir(item_path):
            all_files.extend(get_all_files(item_path))
    return all_files
 
# 현재 디렉토리와 하위 디렉토리의 모든 파일 가져오기
all_files = get_all_files(".")
print(all_files)

디렉토리 vs. 파일 식별하기

os.path.isfile()os.path.isdir() 함수를 사용하여 파일 시스템 내 항목이 파일인지 디렉토리인지 확인할 수 있습니다.

예시:

import os
 
# 경로가 파일인지 확인
if os.path.isfile("file.txt"):
    print("파일입니다!")
else:
    print("파일이 아닙니다.")
 
# 경로가 디렉토리인지 확인
if os.path.isdir("documents"):
    print("디렉토리입니다!")
else:
    print("디렉토리가 아닙니다.")

os.walk() 함수 사용하기

os.walk() 함수 알아보기

os.walk() 함수는 디렉토리 트리를 재귀적으로 탐색하고 모든 파일과 디렉토리 목록을 가져오는 더 편리한 방법을 제공합니다. 이 함수는 첫 번째 인수인 최상위 디렉토리(root)를 기준으로 디렉토리 트리에 있는 각 디렉토리에 대해 3-튜플로 결과를 반환합니다:

  1. 루트 디렉토리
  2. root에서의 하위 디렉토리 이름 목록('.' 및 '..'은 제외)
  3. root내의 디렉토리가 아닌 파일 이름 목록

예시:

import os
 
for root, dirs, files in os.walk("."):
    print(f"루트 디렉토리: {root}")
    print(f"하위 디렉토리: {dirs}")
    print(f"파일: {files}")
    print()

os.walk() 동작 사용자 정의하기

추가 인수를 제공하여 os.walk() 동작을 사용자 정의할 수 있습니다:

  • topdown: True인 경우 os.walk()은 디렉토리를 디렉토리 트리에서 나타나는 순서대로 방문합니다 (기본값은 True입니다).
  • onerror: os.walk()이 오류를 만나면 호출되는 함수입니다. 이 함수는 단일 인수인 OSError 인스턴스를 받아야 합니다.
  • followlinks: True인 경우 os.walk()은 심볼릭 링크를 따라갑니다 (기본값은 False입니다).

예시:

import os
 
for root, dirs, files in os.walk(".", topdown=False, onerror=lambda err: print(f"오류: {err}"), followlinks=True):
    print(f"루트 디렉토리: {root}")
    print(f"하위 디렉토리: {dirs}")
    print(f"파일: {files}")
    print()

확장자에 따른 파일 필터링하기

파일 확장자 확인하기

os.path.splitext() 함수를 사용하여 파일의 확장자를 확인할 수 있습니다. 이 함수는 경로의 루트(root)와 확장자(extension)를 포함하는 2-튜플을 반환합니다.

예시:

import os
 
file_path = "documents/file.txt"
root, ext = os.path.splitext(file_path)
print(f"Root: {root}")
print(f"Extension: {ext}")

특정 확장자를 가진 파일 목록 작성하기

파일 확장자 확인과 디렉토리 탐색 기술을 결합하여 특정 확장자를 가진 파일들의 목록을 작성할 수 있습니다.

예시:

import os
 
def get_files_by_extension(directory, extension):
    all_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                file_path = os.path.join(root, file)
                all_files.append(file_path)
    return all_files
 
# 현재 디렉토리와 서브디렉토리에서 모든 .txt 파일 가져오기
txt_files = get_files_by_extension(".", ".txt")
print(txt_files)

파일 목록 정렬하고 정리하기

파일 목록 정렬하기

파일 이름, 크기 또는 수정 시간과 같은 다양한 기준에 따라 파일 목록을 정렬할 수 있습니다. Python의 sorted() 함수를 사용하여 파일 목록을 정렬할 수 있습니다.

예시:

import os
 
# 현재 디렉토리의 파일 목록 가져오기
files = os.listdir(".")
 
# 이름으로 파일 정렬하기
sorted_files = sorted(files)
print(sorted_files)
 
# 크기로 파일 정렬하기
file_sizes = [(file, os.path.getsize(file)) for file in files]
sorted_by_size = sorted(file_sizes, key=lambda x: x[1])
print(sorted_by_size)

확장자별로 파일 그룹화하기

파일을 확장자별로 그룹화하고 파일을 정리하기 위해 딕셔너리나 유사한 데이터 구조를 생성할 수 있습니다.

예시:

import os
from collections import defaultdict
 
def group_files_by_extension(directory):
    file_groups = defaultdict(list)
    for root, dirs, files in os.walk(directory):
        for file in files:
            _, ext = os.path.splitext(file)
            file_path = os.path.join(root, file)
            file_groups[ext].append(file_path)
    return file_groups
 
# 현재 디렉토리와 서브디렉토리에서 파일 그룹화하기
file_groups = group_files_by_extension(".")
for extension, files in file_groups.items():
    print(f"{extension}: {files}")

에러 처리와 예외 상황 다루기

권한 및 접근 문제 다루기

파일 시스템 작업 중 권한 또는 접근 문제가 발생할 수 있습니다. 이러한 오류를 처리하고 적절한 오류 처리를 제공하기 위해 try-except 블록을 사용할 수 있습니다.

예시:

import os
 
def get_file_info(file_path):
    try:
        file_size = os.path.getsize(file_path)
        last_modified = os.path.getmtime(file_path)
        return file_size, last_modified
    except OSError as e:
        print(f"파일 {file_path}에 대한 접근 오류 발생: {e}")
        return None, None
 
# 파일에 대한 정보 가져오기
file_info = get_file_info("file.txt")
if file_info[0] is not None:
    file_size, last_modified = file_info
    print(f"파일 크기: {file_size} 바이트")
    print(f"마지막 수정일: {last_modified}")

심볼릭 링크 및 기타 특수 파일 처리

Python의 osos.path 모듈은 심볼릭 링크, named pipe 및 device 파일과 같은 다양한 유형의 특수 파일을 처리할 수 있습니다. os.path.islink() 함수를 사용하여 파일이 심볼릭 링크인지 확인할 수 있습니다.

예시:

import os
 
def handle_special_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.islink(file_path):
                print(f"Symbolic link: {file_path}")
            elif os.path.isfifo(file_path):
                print(f"Named pipe: {file_path}")
            elif os.path.isdev(file_path):
                print(f"Device file: {file_path}")
            else:
                print(f"Regular file: {file_path}")
 
# 현재 디렉토리와 서브디렉토리에서 특수 파일 처리하기
handle_special_files(".")

데이터 구조

리스트

리스트는 Python에서 가장 기본적인 데이터 구조 중 하나입니다. 리스트는 순서가 있는 항목의 컬렉션으로, 숫자, 문자열 및 리스트나 사전과 같은 다른 데이터 구조와 같은 다양한 데이터 유형의 값을 보유할 수 있습니다.

다음은 리스트를 생성하고 일반적인 작업을 수행하는 예시입니다:

# 리스트 생성하기
fruits = ['apple', 'banana', 'cherry']
 
# 요소 접근하기
print(fruits[0])  # 출력: 'apple'
print(fruits[-1])  # 출력: 'cherry'
 
# 요소 추가하기
fruits.append('orange')
print(fruits)  # 출력: ['apple', 'banana', 'cherry', 'orange']
 
# 요소 삭제하기
fruits.remove('banana')
print(fruits)  # 출력: ['apple', 'cherry', 'orange']
 
# 슬라이싱
print(fruits[1:3])  # 출력: ['cherry', 'orange']

튜플

튜플은 리스트와 유사하지만 변경할 수 없는(immutable) 특징을 가지고 있습니다. 튜플은 대괄호 [] 대신 괄호 ()를 사용하여 정의됩니다.

# 튜플 생성하기
point = (2, 3)
print(point)  # 출력: (2, 3)
 
# 요소 접근하기
print(point[0])  # 출력: 2
print(point[1])  # 출력: 3
 
# 언패킹
x, y = point
print(x)  # 출력: 2
print(y)  # 출력: 3

사전

사전은 키-값 쌍의 순서 없는 컬렉션입니다. 고유한 키를 사용하여 데이터를 빠르게 저장하고 검색할 수 있습니다.

# 사전 생성하기
person = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}
 
# 값 접근하기
print(person['name'])  # 출력: 'John Doe'
print(person['age'])  # 출력: 30
 
# 항목 추가 및 수정하기
person['email'] = 'john.doe@example.com'
person['age'] = 31
print(person)  # 출력: {'name': 'John Doe', 'age': 31, 'city': 'New York', 'email': 'john.doe@example.com'}
 
# 사전 순회하기
for key, value in person.items():
    print(f"{key}: {value}")

집합


sets는 순서가 없는 고유한 원소들의 컬렉션입니다. 합집합, 교집합 및 차집합과 같은 연산을 수행하는 데 유용합니다.

# set 생성
colors = {'red', 'green', 'blue'}
print(colors)  # 출력: {'red', 'green', 'blue'}
 
# 원소 추가 및 제거
colors.add('yellow')
colors.remove('green')
print(colors)  # 출력: {'red', 'blue', 'yellow'}
 
# set 연산
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 | set2)  # 합집합: {1, 2, 3, 4}
print(set1 & set2)  # 교집합: {2, 3}
print(set1 - set2)  # 차집합: {1}

제어 흐름

조건문

if-elseif-elif-else와 같은 조건문을 사용하면 특정 조건에 따라 다른 코드 블록을 실행할 수 있습니다.

# if-else 문
age = 18
if age >= 18:
    print("당신은 성인입니다.")
else:
    print("당신은 미성년자입니다.")
 
# if-elif-else 문
score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("D")

반복문

forwhile과 같은 반복문을 사용하면 코드 블록을 반복적으로 실행할 수 있습니다.

# for 루프
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# while 루프
count = 0
while count < 5:
    print(count)
    count += 1

리스트 컴프리헨션

리스트 컴프리헨션은 기존 리스트를 기반으로 새로운 리스트를 간결하게 생성하는 방법을 제공합니다.

# 리스트 컴프리헨션
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
print(squares)  # 출력: [1, 4, 9, 16, 25]
 
# 조건부 리스트 컴프리헨션
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # 출력: [2, 4]

함수

함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 인수를 받을 수 있고 반환 값이 있을 수 있으며 코드를 구조화하는 데 도움이 됩니다.

# 함수 정의
def greet(name):
    print(f"안녕하세요, {name}!")
 
# 함수 호출
greet("Alice")  # 출력: 안녕하세요, Alice!
 
# 반환 값이 있는 함수
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 출력: 7

모듈과 패키지

Python의 풍부한 표준 라이브러리와 서드파티 패키지는 프로젝트에서 활용할 수 있는 다양한 기능을 제공합니다.

# 모듈 import
import math
print(math.pi)  # 출력: 3.141592653589793
 
# 모듈에서 특정 함수 import
from math import sqrt, floor
print(sqrt(16))  # 출력: 4.0
print(floor(3.7))  # 출력: 3
 
# 패키지 import
import datetime
print(datetime.datetime.now())  # 출력: 2023-04-24 12:34:56.789012

예외 처리

예외 처리를 사용하면 코드에서 발생하는 오류와 예기치 않은 상황을 우아하게 처리할 수 있습니다.

# 예외 처리
try:
    result = 10 / 0
except ZeroDivisionError:
    print("오류: 0으로 나눔.")
 
# 여러 개의 예외 처리
try:
    int('abc')
except ValueError:
    print("오류: 잘못된 정수 형식.")

파일 입출력

Python은 파일에 대한 읽기 및 쓰기를 위한 내장 함수와 메서드를 제공합니다.

# 파일에 쓰기
with open('example.txt', 'w') as file:
    file.write("안녕, 세상!")
 
# 파일에서 읽기
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # 출력: 안녕, 세상!

결론

이 Python 튜토리얼에서는 다양한 데이터 구조, 제어 흐름, 함수, 모듈과 패키지, 예외 처리 및 파일 입출력에 대해 알아보았습니다. 이러한 개념은 Python 프로그래밍의 기초이며 더 효율적이고 유지 관리 가능한 코드를 작성하는 데 도움이 될 것입니다. 정기적으로 연습하고 Python 라이브러리와 프레임워크의 방대한 생태계를 탐색하여 지식과 기술을 확장해보세요.

MoeNagy Dev