python
디렉토리에서 파일 목록 빠르게 가져오기: 파이썬 가이드

디렉토리에서 파일 목록 빠르게 가져오기: 파이썬 가이드

MoeNagy Dev

os 및 os.path 모듈 살펴보기

os 및 os.path 모듈 개요

Python의 osos.path 모듈은 운영체제의 파일 시스템과 플랫폼에 독립적인 방식으로 상호작용하는 기능을 제공합니다. 이러한 모듈은 디렉토리 내 파일 목록 작성부터 파일 및 디렉토리 경로 관리까지 다양한 기능을 제공합니다.

현재 작업 디렉토리에 액세스하기

os.getcwd() 함수를 사용하여 현재 작업 디렉토리를 가져올 수 있습니다:

import os
 
current_dir = os.getcwd()
print(current_dir)

이는 현재 작업 디렉토리의 절대 경로를 출력합니다.

현재 디렉토리의 파일 목록 가져오기

os.listdir() 함수를 사용하여 현재 작업 디렉토리의 모든 파일과 디렉토리를 나열할 수 있습니다:

import os
 
files_and_dirs = os.listdir()
print(files_and_dirs)

이는 현재 디렉토리의 모든 항목(파일과 디렉토리)의 목록을 반환합니다.

os.listdir() 함수 사용하기

os.listdir()의 기본

os.listdir() 함수는 선택적 인수를 사용할 수 있습니다. 이 인수는 목록을 얻고자 하는 디렉토리의 경로입니다. 인수가 제공되지 않으면 현재 작업 디렉토리의 내용을 나열합니다.

import os
 
# 현재 디렉토리의 파일 목록 나열
files_and_dirs = os.listdir()
print(files_and_dirs)
 
# 특정 디렉토리의 파일 목록 나열
specific_dir = "/경로/디렉토리"
files_and_dirs = os.listdir(specific_dir)
print(files_and_dirs)

특정 디렉토리의 파일 목록 가져오기

특정 디렉토리의 파일 목록을 가져오려면 os.listdir()에 디렉토리 경로를 인수로 전달합니다:

import os
 
specific_dir = "/경로/디렉토리"
files_and_dirs = os.listdir(specific_dir)
print(files_and_dirs)

이는 지정된 디렉토리의 모든 항목(파일과 디렉토리) 목록을 반환합니다.

상대 경로와 절대 경로 다루기

os.listdir()에서 상대 경로와 절대 경로를 모두 사용할 수 있습니다. 상대 경로는 현재 작업 디렉토리를 기준으로 해석되고, 절대 경로는 디렉토리의 전체 경로로 해석됩니다.

import os
 
# 상대 경로 사용
rel_path = "문서"
files_and_dirs = os.listdir(rel_path)
print(files_and_dirs)
 
# 절대 경로 사용
abs_path = "/home/user/문서"
files_and_dirs = os.listdir(abs_path)
print(files_and_dirs)

파일 목록 필터링하기

목록에서 디렉토리 제외하기

디렉토리를 제외하고 디렉토리의 파일만 나열하려면 os.path.isfile() 함수를 사용하여 목록을 필터링할 수 있습니다:

import os
 
directory = "/경로/디렉토리"
all_items = os.listdir(directory)
files = [item for item in all_items if os.path.isfile(os.path.join(directory, item))]
print(files)

이렇게 하면 디렉토리를 제외한 파일 이름만 포함하는 새로운 목록 files가 생성됩니다.

파일 확장자로 목록 필터링하기

파일 목록을 파일 확장자로 필터링하려면 목록 컴프리헨션을 사용할 수 있습니다:

import os
 
directory = "/경로/디렉토리"
all_items = os.listdir(directory)
txt_files = [item for item in all_items if item.endswith(".txt")]
print(txt_files)

이렇게 하면 .txt 확장자를 가진 파일 이름만 포함하는 새로운 목록 txt_files가 생성됩니다.

고급 필터링에 대한 목록 컴프리헨션 사용하기

목록 컴프리헨션을 사용하여 더 복잡한 필터링 로직을 적용할 수 있습니다. 예를 들어, 특정 확장자를 가진 파일 중 특정 크기보다 큰 파일의 목록을 가져올 수 있습니다:

import os
 
directory = "/경로/디렉토리"
all_items = os.listdir(directory)
large_csv_files = [
    item
    for item in all_items
    if item.endswith(".csv") and os.path.getsize(os.path.join(directory, item)) > 1024 * 1024
]
print(large_csv_files)

이렇게 하면 1MB보다 큰 디렉토리의 CSV 파일만 포함하는 새로운 목록 large_csv_files가 생성됩니다.

하위 디렉토리에서 파일 재귀적으로 나열하기

os.walk()로 하위 디렉토리 탐색하기

os.walk() 함수는 디렉토리 트리를 재귀적으로 탐색하고 하위 디렉토리의 모든 파일을 나열하는 데 사용할 수 있습니다. 이 함수는 방문하는 각 디렉토리에 대해 3개의 튜플을 생성하는 생성자를 반환합니다: 디렉토리의 경로, 해당 디렉토리의 디렉토리 목록, 해당 디렉토리의 파일 목록입니다.

import os
 
directory = "/경로/디렉토리"
for root, dirs, files in os.walk(directory):
    for file in files:
        print(os.path.join(root, file))

이렇게 하면 지정된 디렉토리를 시작으로 디렉토리 트리의 각 파일의 전체 경로가 인쇄됩니다.

재귀적으로 파일 경로 다루기

os.walk()을 사용할 때 특히 하위 디렉토리를 처리할 때 파일 경로를 올바르게 처리해야 합니다. os.path.join() 함수를 사용하여 디렉토리 경로와 파일 이름을 결합하여 파일의 전체 경로를 구성할 수 있습니다.

import os
 
directory = "/경로/디렉토리"
for root, dirs, files in os.walk(directory):
    for file in files:
        full_path = os.path.join(root, file)
        print(full_path)

이렇게 하면 디렉토리 구조를 고려하여 각 파일의 전체 경로가 인쇄됩니다.

출력 형식 사용자 정의하기

필요에 따라 출력 형식을 사용자 정의할 수 있습니다. 예를 들어, 파일 크기와 수정 시간을 파일 경로와 함께 인쇄할 수 있습니다:

import os
from datetime import datetime
 
directory = "/경로/디렉토리"
for root, dirs, files in os.walk(directory):
    for file in files:
        full_path = os.path.join(root, file)
file_size = os.path.getsize(full_path)
mod_time = os.path.getmtime(full_path)
mod_time_str = datetime.fromtimestamp(mod_time).strftime("%Y-%m-%d %H:%M:%S")
print(f"{full_path} - Size: {file_size} 바이트 - 수정 시간: {mod_time_str}")

이는 디렉토리 트리에 있는 각 파일의 파일 경로, 크기 및 수정 시간을 출력합니다.

os.path 모듈과 함께 작업하기

os.path.join()을 사용하여 경로 연결하기

os.path.join() 함수는 하나 이상의 경로 구성 요소를 지능적으로 연결하여 파일 경로를 구성하는 데 사용됩니다. 이는 운영 체제에 따라 적절한 경로 구분 기호(예: 유닉스 같은 시스템의 슬래시, 윈도우의 역 슬래시)를 처리합니다.

import os
 
directory = "/경로/디렉토리"
filename = "예제.txt"
full_path = os.path.join(directory, filename)
print(full_path)

이는 현재 운영 체제에 적합한 경로 구분 기호를 사용하여 파일의 전체 경로를 출력합니다.

경로가 파일인지 디렉토리인지 확인하기

os.path.isfile()os.path.isdir() 함수는 주어진 경로가 각각 파일인지 디렉토리인지 확인하는 데 사용될 수 있습니다.

import os
 
path = "/파일의/경로.txt"
if os.path.isfile(path):
    print(f"{path}은(는) 파일입니다.")
else:
    print(f"{path}은(는) 파일이 아닙니다.")
 
path = "/디렉토리/경로"
if os.path.isdir(path):
    print(f"{path}은(는) 디렉토리입니다.")
else:
    print(f"{path}은(는) 디렉토리가 아닙니다.")

파일 크기 및 수정 시간 얻기

os.path.getsize()os.path.getmtime() 함수를 사용하여 파일의 크기와 마지막 수정 시간을 가져올 수 있습니다.

import os
from datetime import datetime
 
path = "/파일의/경로.txt"
file_size = os.path.getsize(path)
mod_time = os.path.getmtime(path)
mod_time_str = datetime.fromtimestamp(mod_time).strftime("%Y-%m-%d %H:%M:%S")
print(f"파일 크기: {file_size} 바이트")
print(f"마지막 수정 시간: {mod_time_str}")

이는 파일의 크기를 바이트 단위로 출력하고 파일의 마지막 수정 시간을 출력합니다.

크로스 플랫폼 호환성 다루기

운영 체제 간 차이점 다루기

osos.path 모듈은 플랫폼에 독립적인 인터페이스를 제공하기 위해 설계되었지만 여전히 다른 운영 체제에서 파일 경로가 처리되는 방식에는 일부 차이점이 있습니다(예: 윈도우는 역 슬래시, 유닉스 같은 시스템은 슬래시 사용).

다른 플랫폼에서 일관된 동작 보장하기

다른 플랫폼에서 코드가 일관되게 동작하도록 보장하려면, os.path 모듈의 적절한 함수와 메소드(예: os.path.join(), os.path.normpath(), os.path.normcase())를 사용해야 합니다.

os.path.normpath() 및 os.path.normcase() 활용하기

os.path.normpath() 함수는 중복 구분 기호와 상위 레벨 참조(예: ../)를 축소하여 경로를 정규화하는 데 사용될 수 있습니다. os.path.normcase() 함수는 경로의 대소문자를 정규화하는 데 사용될 수 있으며, 대소문자가 구분되는 파일 시스템에서 중요합니다.

import os
 
# 경로 정규화
path = "/경로/../파일.txt"
normalized_path = os.path.normpath(path)
print(normalized_path)  # 출력: "/경로/파일.txt"
 
# 경로의 대소문자 정규화
path = "/경로/파일.txt"
normalized_path = os.path.normcase(path)
print(normalized_path)  # 출력: "/경로/파일.txt" (유닉스 같은 시스템에서)

이러한 함수를 사용하여 파일 경로가 서로 다른 운영 체제에서 일관된 형식으로 포맷되도록 할 수 있습니다.

파일 목록 정렬 및 구성

이름, 크기 또는 수정 시간별로 파일 목록 정렬하기

파일 목록을 파일 이름, 크기 또는 수정 시간과 같은 다양한 속성을 기준으로 정렬할 수 있습니다. 이를 위해 sorted() 함수와 적절한 키 함수를 사용할 수 있습니다.

import os
 
directory = "/경로/디렉토리"
files = os.listdir(directory)
 
# 파일 이름별로 정렬
sorted_files = sorted(files)
print(sorted_files)
 
# 파일 크기별로 정렬
file_sizes = [(f, os.path.getsize(os.path.join(directory, f))) for f in files]
sorted_files = sorted(file_sizes, key=lambda x: x[1])
print(sorted_files)
 
# 수정 시간별로 정렬
file_mod_times = [(f, os.path.getmtime(os.path.join(directory, f))) for f in files]
sorted_files = sorted(file_mod_times, key=lambda x: x[1])
print(sorted_files)

이는 각각 파일 이름, 크기 및 수정 시간별로 정렬된 파일 목록을 출력합니다.

확장자별로 파일 그룹화 또는 기타 속성별로 그룹화

딕셔너리 또는 defaultdict를 사용하여 파일을 파일 확장자나 기타 속성별로 그룹화할 수 있습니다.

import os
from collections import defaultdict
 
directory = "/경로/디렉토리"
files = os.listdir(directory)
 
# 확장자별로 파일 그룹화
file_groups = defaultdict(list)
for file in files:
    extension = os.path.splitext(file)[1][1:]
    file_groups[extension].append(file)
 
for extension, files in file_groups.items():
    print(f"{extension} 파일: {', '.join(files)}")
 
# 파일 크기별로 그룹화 (MB 단위)
file_sizes = [(f, os.path.getsize(os.path.join(directory, f))) for f in files]
file_groups = defaultdict(list)
for file, size in file_sizes:
    size_mb = size / (1024 * 1024)
    file_groups[f"{size_mb:.2f} MB"].append(file)
 
for size, files in file_groups.items():
    print(f"{size} 파일: {', '.join(files)}")

이는 파일을 확장자 또는 다른 속성별로 그룹화합니다.

데이터 구조

리스트

리스트는 파이썬에서 가장 다재다능한 데이터 구조 중 하나입니다. 다른 데이터 유형일 수 있는 항목들의 순서대로 구성됩니다. 다음은 예시입니다:

my_list = [1, '사과', 3.14, True]

리스트의 개별 요소에는 인덱스를 사용하여 액세스할 수 있으며, 인덱스는 0부터 시작합니다:

print(my_list[0])  # 출력: 1
print(my_list[2])  # 출력: 3.14

리스트의 요소를 수정할 수도 있습니다:

my_list[1] = '바나나'
print(my_list)  # 출력: [1, '바나나', 3.14, True]

리스트에는 append(), insert(), remove(), sort()와 같은 여러 내장 메소드가 있습니다.

튜플

튜플은 리스트와 비슷하지만 변경되지 않으며, 한 번 생성된 후에는 원소를 수정할 수 없다는 것을 의미합니다. 튜플은 대괄호 [] 대신 괄호 ()를 사용하여 정의됩니다.

my_tuple = (1, 'apple', 3.14, True)
print(my_tuple[0])  # 출력: 1

튜플은 데이터의 순서와 내용을 변경하지 않고 유지하고 싶을 때 유용합니다.

사전

사전은 키-값 쌍의 정렬되지 않은 컬렉션입니다. 중괄호 {}를 사용하여 정의되며, 각 키-값 쌍은 콜론 :으로 구분됩니다.

my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}
print(my_dict['name'])  # 출력: 'John'

사전에서 키-값 쌍을 추가, 수정 및 삭제할 수 있습니다:

my_dict['email'] = 'john@example.com'
my_dict['age'] = 31
del my_dict['city']

사전은 고유한 키에 기반하여 데이터를 저장하고 검색하는 데 강력합니다.

집합

집합은 고유한 요소로 이루어진 정렬되지 않은 컬렉션입니다. 중괄호 {}set() 함수를 사용하여 정의됩니다.

my_set = {1, 2, 3, 4, 5}
print(2 in my_set)  # 출력: True
print(6 in my_set)  # 출력: False

집합은 데이터 컬렉션 간의 합집합, 교집합 및 차집합과 같은 연산을 수행하는 데 유용합니다.

제어 흐름

조건문

파이썬에서 조건문은 키워드 if, elif, else를 사용하여 특정 조건에 따라 코드 블록을 실행합니다.

x = 10
if x > 0:
    print("x는 양수입니다")
elif x < 0:
    print("x는 음수입니다")
else:
    print("x는 0입니다")

반복문

파이썬에는 forwhile 두 가지 주요 반복 구조가 있습니다. for 반복문은 시퀀스(리스트, 튜플 또는 문자열)를 반복하고, while 반복문은 특정 조건이 참인 동안 코드 블록을 실행합니다.

# For 반복문
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# While 반복문
count = 0
while count < 5:
    print(count)
    count += 1

또한 breakcontinue 문을 사용하여 반복문의 흐름을 제어할 수 있습니다.

리스트 내장

리스트 내장은 기존의 리스트를 기반으로 새로운 리스트를 간결하게 생성하는 방법을 제공합니다. 데이터의 변환 또는 필터링에 유용합니다.

# 1부터 10까지 숫자의 제곱으로 새로운 리스트 생성
squares = [x**2 for x in range(1, 11)]
print(squares)  # 출력: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
 
# 1부터 10까지의 짝수로 새로운 리스트 생성
even_numbers = [x for x in range(1, 11) if x % 2 == 0]
print(even_numbers)  # 출력: [2, 4, 6, 8, 10]

함수

파이썬에서 함수는 def 키워드를 사용하여 정의됩니다. 매개변수를 받고 값을 반환할 수 있습니다.

def greet(name):
    """주어진 이름으로 인사합니다."""
    print(f"안녕하세요, {name}님!")
 
greet("Alice")  # 출력: 안녕하세요, Alice님!

매개변수의 기본값과 가변인자를 사용하여 함수를 정의할 수도 있습니다.

def calculate_area(length, width=1):
    """직사각형의 넓이를 계산합니다."""
    return length * width
 
print(calculate_area(5, 3))  # 출력: 15
print(calculate_area(4))  # 출력: 4 (기본 폭은 1)
 
def sum_numbers(*args):
    """임의 개수의 인수들의 합을 계산합니다."""
    return sum(args)
 
print(sum_numbers(1, 2, 3))  # 출력: 6
print(sum_numbers(4, 5, 6, 7, 8))  # 출력: 30

함수는 간단한 일줄 작업을 위해 람다 함수(익명 함수)로 정의될 수도 있습니다.

square = lambda x: x**2
print(square(5))  # 출력: 25

모듈과 패키지

파이썬의 표준 모듈 라이브러리를 통해 프로그램에서 사용할 수 있는 다양한 기능을 제공합니다. 또한 코드를 구성하고 종속성을 관리하기 위해 자체 모듈과 패키지를 만들 수도 있습니다.

# 내장 모듈 사용
import math
print(math.pi)  # 출력: 3.141592653589793
 
# 사용자 정의 모듈 생성
# my_module.py
def greet(name):
    print(f"안녕하세요, {name}님!")
 
# 사용자 정의 모듈 사용
import my_module
my_module.greet("Alice")  # 출력: 안녕하세요, Alice님!

패키지는 모듈의 집합으로, 코드의 구조를 조직화하고 종속성을 관리하는 데 도움이 됩니다.

예외 처리

파이썬의 예외 처리 메커니즘을 사용하면 코드에서 오류와 예기치 않은 상황을 처리할 수 있습니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("오류: 0으로 나눌 수 없습니다")
else:
    print(f"결과: {result}")
finally:
    print("이 블록은 항상 실행됩니다.")

필요할 때 사용자 정의 예외를 정의하고 발생시킬 수도 있습니다.

class InvalidInputError(Exception):
    pass
 
def divide(a, b):
    if b == 0:
        raise InvalidInputError("오류: 0으로 나눌 수 없습니다")
    return a / b
 
try:
    print(divide(10, 0))
except InvalidInputError as e:
    print(e)

파일 입출력

파이썬은 파일을 읽고 쓰기 위한 내장 함수를 제공합니다.

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

with 문은 작업이 완료된 후 파일이 제대로 닫히도록 보장합니다.

결론

이 파이썬 튜토리얼에서 데이터 구조, 제어 흐름, 함수, 모듈 및 패키지, 예외 처리, 파일 입출력 등 다양한 주제를 다루었습니다. 이러한 개념을 이해하면 능숙한 파이썬 프로그래머가 되는 길에 한 발짝 더 다가서게 될 것입니다. 정기적으로 연습하고 파이썬의 라이브러리와 프레임워크를 탐색하여 기술을 확장하고 강력한 애플리케이션을 구축하세요.

MoeNagy Dev