python
디렉토리의 모든 파일 쉽게 가져오기: 파이썬 설명

디렉토리의 모든 파일 쉽게 가져오기: 파이썬 설명

MoeNagy Dev

파이썬으로 디렉토리의 모든 파일 가져오기

디렉토리 안의 파일 목록을 작성하는 중요성

프로젝트의 파일 구조를 이해하는 것은 효과적인 파일 관리와 자동화에 중요합니다. 디렉토리 안의 파일을 목록으로 작성할 수 있다면 다음과 같은 이점을 얻을 수 있습니다:

  • 프로젝트의 파일 구성 이해: 디렉토리 안의 파일을 나열함으로써, 어떤 파일이 있는지, 파일 이름은 무엇인지, 그리고 디렉토리 구조 내에서 어떻게 구성되어 있는지를 빠르게 파악할 수 있습니다.
  • 파일 관련 작업 자동화: 프로그래밍을 통해 파일을 목록으로 만들면 파일 백업, 미디어 파일 정리 또는 소스 코드 분석 등과 같은 다양한 작업을 자동적이고 효율적으로 수행할 수 있습니다.
  • 파일 내용 및 메타데이터 분석: 파일 목록이 있으면 파일 크기, 수정 시간 또는 기타 메타데이터와 같은 정보를 추가로 처리하여 프로젝트에 대한 통찰력을 얻을 수 있습니다.

파이썬에서의 기본 파일 처리

디렉토리의 파일을 목록으로 작성하기에 앞서 파이썬에서의 기본 파일 처리에 대해 간단히 알아보겠습니다.

파일 열기 및 닫기

파이썬에서 open() 함수를 사용하여 파일을 열 수 있습니다. 기본 구문은 다음과 같습니다:

file = open("filename.txt", "r")
# 파일에 대한 작업 실행
file.close()

open() 함수의 두 번째 인자는 "r"처럼 읽기, "w"처럼 쓰기 또는 "a"처럼 추가하기와 같은 모드를 지정합니다.

파일을 사용한 후에는 파일을 닫아서 변경 내용을 저장하고 시스템 리소스가 제대로 해제되도록 해야 합니다.

파일 내용 읽기 및 쓰기

한 번 파일을 열게 되면 read() 메서드를 사용하여 파일의 내용을 읽을 수 있습니다:

file = open("filename.txt", "r")
content = file.read()
print(content)
file.close()

파일에 쓰기 위해서는 write() 메서드를 사용할 수 있습니다:

file = open("filename.txt", "w")
file.write("This is some content to be written to the file.")
file.close()

디렉토리의 파일 목록 작성하기

이제 파이썬을 사용하여 디렉토리의 파일 목록을 작성하는 방법을 알아보겠습니다.

os 모듈 사용하기

파이썬의 os 모듈은 파일과 디렉토리 관리를 포함한 운영 체제와 상호작용하기 위한 함수 집합을 제공합니다. 디렉토리 안의 파일을 목록화하려면 os.listdir() 함수를 사용합니다.

import os
 
directory = "/path/to/directory"
files = os.listdir(directory)
print(files)

위 코드는 지정된 directory 내의 모든 파일과 디렉토리의 목록을 출력합니다.

참고로, os.listdir() 함수는 파일과 디렉토리의 이름만 반환하며, 경로 전체는 반환하지 않습니다. 전체 경로가 필요한 경우 os.listdir() 함수와 os.path.join() 함수를 함께 사용할 수 있습니다:

import os
 
directory = "/path/to/directory"
file_paths = [os.path.join(directory, filename) for filename in os.listdir(directory)]
print(file_paths)

위 코드는 디렉토리와 파일 이름을 결합한 전체 파일 경로 목록을 반환합니다.

상대 경로와 절대 경로 처리

파일 경로를 처리할 때, 상대 경로 또는 절대 경로를 사용할 수 있습니다. 상대 경로는 현재 작업 디렉토리를 기준으로 한 경로이고, 절대 경로는 루트 디렉토리부터의 전체 경로를 지정합니다.

현재 작업 디렉토리를 확인하기 위해 os.getcwd() 함수를 사용할 수 있습니다:

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

이 정보를 사용하여 필요에 따라 상대 경로 또는 절대 경로를 구성할 수 있습니다.

확장자로 파일 필터링하기

자주 특정 확장자(예: .txt 또는 .py)를 가진 파일만 나열하고 싶을 수 있습니다. 이를 위해 다양한 기술을 사용할 수 있습니다.

파일 확장자 확인하기

파일 확장자로 파일을 필터링하는 한 가지 방법은 문자열 연산을 사용하여 파일 확장자를 확인하는 것입니다:

import os
 
directory = "/path/to/directory"
txt_files = [f for f in os.listdir(directory) if f.endswith(".txt")]
print(txt_files)

이를 통해 .txt 확장자를 가진 파일만을 포함하는 새로운 목록을 생성하는 리스트 내포를 사용합니다.

또는 os.path.splitext() 함수를 사용하여 파일 확장자를 추출할 수 있습니다:

import os
 
directory = "/path/to/directory"
py_files = [f for f in os.listdir(directory) if os.path.splitext(f)[1] == ".py"]
print(py_files)

이 접근 방식은 파일 이름과 확장자를 분리하여 확장자를 직접 확인할 수 있도록 합니다.

하위 디렉토리 재귀적 순회하기

프로젝트가 하위 디렉토리를 포함한 복잡한 디렉토리 구조를 가지고 있다면 전체 디렉토리 트리에서 모든 파일을 재귀적으로 나열하고 싶을 수 있습니다. os.walk() 함수를 사용하여 이 작업을 수행할 수 있습니다.

import os
 
directory = "/path/to/directory"
for root, dirs, files in os.walk(directory):
    for file in files:
        print(os.path.join(root, file))

os.walk() 함수는 순회하는 각 디렉토리마다 세 가지 값을 생성합니다:

  1. root: 현재 처리 중인 디렉토리입니다.
  2. dirs: 현재 디렉토리의 하위 디렉토리 목록입니다.
  3. files: 현재 디렉토리의 파일 목록입니다.

files 목록을 반복문으로 순회함으로써 디렉토리 트리 내의 각 파일의 전체 경로에 액세스할 수 있습니다.

파일 목록 정렬 및 구성하기

파일 목록을 소팅하거나 특정한 방식으로 구성하고 싶을 수 있습니다. 파이썬에 내장된 sorted() 함수를 사용할 수 있습니다.

알파벳순 정렬

파일 목록을 알파벳순으로 정렬하려면 sorted() 함수를 사용할 수 있습니다:

import os
 
directory = "/path/to/directory"
files = sorted(os.listdir(directory))
print(files)

이는 파일 목록을 알파벳순으로 정렬합니다.

파일 크기 또는 수정 시간에 따른 정렬

이 마크다운 파일을 한국어로 번역해드리겠습니다. frontmatter가 있는 경우 language 매개변수도 ko로 맞춰서 번역해주세요. 코드는 번역하지 말고, 주석만 번역해주세요. 샘플 프롬프트의 내용은 번역하지 마세요. 파일은 다음과 같습니다:

파일 목록을 파일 크기나 수정 시간을 기준으로 정렬할 수도 있습니다. 이를 위해서는 sorted() 함수에 사용자 지정 key 함수를 제공할 수 있습니다.

import os
 
directory = "/path/to/directory"
files = sorted(os.listdir(directory), key=lambda x: os.path.getsize(os.path.join(directory, x)), reverse=True)
print(files)

이 코드는 파일 크기 기준으로 내림차순으로 파일 목록을 정렬합니다.

수정 시간을 기준으로 정렬하려면 os.path.getmtime()을 사용하면 됩니다:

import os
from datetime import datetime
 
directory = "/path/to/directory"
files = sorted(os.listdir(directory), key=lambda x: os.path.getmtime(os.path.join(directory, x)), reverse=True)
print(files)

이 코드는 수정 시간 기준으로 파일 목록을 내림차순으로 정렬합니다.

파일 메타데이터 작업

파일 이름과 경로 뿐만 아니라 파일의 크기와 수정 시간 같은 정보도 검색하고 싶을 수 있습니다. 이를 위해 Python은 메타데이터에 접근할 수 있는 함수를 제공합니다.

파일 크기와 수정 시간 검색

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

import os
from datetime import datetime
 
directory = "/path/to/directory"
filename = "example.txt"
file_path = os.path.join(directory, filename)
 
file_size = os.path.getsize(file_path)
file_mtime = os.path.getmtime(file_path)
print(f"파일 크기: {file_size}바이트")
print(f"마지막 수정 시간: {datetime.fromtimestamp(file_mtime)}")

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

파일 크기와 시간 정보 서식화

파일 크기와 시간 정보를 더 읽기 쉽게 서식화할 수 있습니다.

import os
from datetime import datetime
 
directory = "/path/to/directory"
filename = "example.txt"
file_path = os.path.join(directory, filename)
 
file_size = os.path.getsize(file_path)
file_mtime = os.path.getmtime(file_path)
 
# 파일 크기 서식화
if file_size < 1024:
    file_size_str = f"{file_size}바이트"
elif file_size < 1024 * 1024:
    file_size_str = f"{file_size / 1024:.2f}KB"
else:
    file_size_str = f"{file_size / (1024 * 1024):.2f}MB"
 
# 수정 시간 서식화
file_mtime_str = datetime.fromtimestamp(file_mtime).strftime("%Y-%m-%d %H:%M:%S")
 
print(f"파일 크기: {file_size_str}")
print(f"마지막 수정 시간: {file_mtime_str}")

이 코드는 파일 크기를 더 사람이 읽기 쉬운 형식(바이트, KB, 또는 MB)으로 출력하고, 수정 시간을 형식화된 날짜와 시간 문자열로 출력합니다.

오류 처리 및 주의 사항

파일 작업을 할 때는 잠재적인 오류와 예외 상황을 처리하는 것이 중요합니다. Python의 내장 OSError 예외를 사용하면 이를 처리할 수 있습니다.

import os
 
directory = "/path/to/directory"
 
try:
    files = os.listdir(directory)
    for file in files:
        file_path = os.path.join(directory, file)
        file_size = os.path.getsize(file_path)
        print(f"파일: {file}, 크기: {file_size}바이트")
except OSError as e:
    print(f"오류: {e}")
    print("디렉토리에 액세스하거나 파일 정보를 검색할 수 없습니다.")

이 예제에서는 파일 목록 및 파일 크기 검색 작업을 try-except 블록으로 랩핑하여 디렉토리에 액세스할 수 없거나 파일을 읽을 수 없을 때와 같은 OSError 예외를 처리합니다.

이러한 예외를 처리함으로써 프로그램이 비정상 종료되지 않고 더 우아한 오류 메시지를 제공할 수 있습니다.

실용적인 응용 및 사용 사례

이제 디렉토리에서 파일 목록을 나열하는 방법에 대한 이해가 충분하므로 몇 가지 실용적인 응용 및 사용 사례를 살펴보겠습니다.

파일 백업 및 동기화

일반적인 사용 사례 중 하나는 파일 백업을 생성하거나 파일을 다른 위치 간에 동기화하는 것입니다. 디렉토리에 있는 파일을 나열하여 백업이나 동기화해야 할 파일을 식별할 수 있습니다.

import os
import shutil
 
source_dir = "/path/to/source/directory"
backup_dir = "/path/to/backup/directory"
 
for filename in os.listdir(source_dir):
    src_path = os.path.join(source_dir, filename)
    dst_path = os.path.join(backup_dir, filename)
    shutil.copy2(src_path, dst_path)
    print(f"백업 완료: {filename}")

이 예제는 source_dir에서 backup_dir 디렉토리로 파일을 복사하여 파일의 백업을 생성합니다.

미디어 파일 정리

다른 사용 사례는 미디어 파일(예: 사진, 동영상)을 파일 확장자나 메타데이터를 기반으로 정리하는 것입니다. 디렉토리에 있는 파일을 나열하여 적절한 하위 디렉토리로 이동하여 정렬할 수 있습니다.

import os
import shutil
 
media_dir = "/path/to/media/directory"
photo_dir = "/path/to/photos/directory"
video_dir = "/path/to/videos/directory"
 
for filename in os.listdir(media_dir):
    src_path = os.path.join(media_dir, filename)
    if filename.endswith(".jpg") or filename.endswith(".png"):
        dst_path = os.path.join(photo_dir, filename)
    elif filename.endswith(".mp4") or filename.endswith(".mov"):
        dst_path = os.path.join(video_dir, filename)
    else:
        continue
    shutil.move(src_path, dst_path)
    print(f"이동 완료: {filename}")

이 예제는 media_dir에 있는 미디어 파일을 파일 확장자에 따라 정렬하여 이미지 파일을 photo_dir로 동영상 파일을 video_dir로 이동시킵니다.

소스 코드 분석 및 프로젝트 관리

디렉토리에 있는 파일을 나열하는 것은 소스 코드 분석 및 프로젝트 관리에도 유용합니다. 파일 목록을 사용하여 다음과 같은 작업을 수행할 수 있습니다:

  • 소프트웨어 프로젝트를 구성하는 파일 식별
  • 파일 구조와 조직 분석
  • 파일 크기, 수정 시간 및 기타 메타데이터에 대한 보고서 생성

이 정보를 활용하여 소프트웨어 프로젝트를 더 잘 이해하고 관리할 수 있습니다.

파이썬 중급 개념

클래스와 객체 지향 프로그래밍(OOP)

파이썬에서 클래스는 객체 지향 프로그래밍의 기본적인 구성 요소입니다. 이를 사용하여 사용자 정의 데이터 유형을 속성과 메서드를 가진 형태로 생성할 수 있습니다. 이것은 간단한 Car 클래스의 예제입니다:

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
 
    def start(self):
        print(f"The {self.year} {self.make} {self.model} has started.")
 
    def stop(self):
        print(f"The {self.year} {self.make} {self.model} has stopped.")

이 예제에서 Car 클래스는 세 개의 속성(make, model, year)과 두 개의 메서드(start()stop())를 가지고 있습니다. __init__() 메서드는 새로운 Car 클래스 인스턴스를 생성할 때 자동으로 호출되는 특별한 메서드입니다.

이렇게 Car 클래스의 인스턴스를 생성할 수 있습니다:

my_car = Car("Toyota", "Corolla", 2015)
my_car.start()  # 출력: The 2015 Toyota Corolla has started.
my_car.stop()   # 출력: The 2015 Toyota Corolla has stopped.

객체 지향 프로그래밍은 상속을 지원하며, 기존 클래스를 기반으로 새로운 클래스를 만들 수 있도록 합니다. 여기 Car 클래스를 상속받은 ElectricCar 클래스의 예제가 있습니다:

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_capacity):
        super().__init__(make, model, year)
        self.battery_capacity = battery_capacity
 
    def charge(self):
        print(f"The {self.year} {self.make} {self.model} is charging.")

ElectricCar 클래스는 Car 클래스의 make, model, year 속성과 start(), stop() 메서드를 상속받습니다. 또한 battery_capacity 속성과 charge() 메서드를 추가합니다.

my_electric_car = ElectricCar("Tesla", "Model S", 2020, 100)
my_electric_car.start()  # 출력: The 2020 Tesla Model S has started.
my_electric_car.charge() # 출력: The 2020 Tesla Model S is charging.

모듈과 패키지

파이썬에서 모듈은 코드가 담긴 단일 파일이며, 패키지는 관련된 모듈의 모음입니다. 모듈은 코드를 구성하고 다른 프로젝트에서 재사용 가능하게 만들어줍니다.

다음은 math_functions.py라는 간단한 모듈의 예제입니다:

def add(a, b):
    return a + b
 
def subtract(a, b):
    return a - b
 
def multiply(a, b):
    return a * b
 
def divide(a, b):
    return a / b

이 모듈에서 함수들을 다른 파이썬 파일에서 가져와 사용할 수 있습니다:

from math_functions import add, subtract
print(add(2, 3))  # 출력: 5
print(subtract(5, 3))  # 출력: 2

반면에 패키지는 관련된 모듈들을 함께 그룹화할 수 있습니다. 예를 들어, arithmetic.py, geometry.py, statistics.py 등과 같이 다른 유형의 수학 연산을 위한 모듈을 가진 math 패키지를 생성할 수 있습니다.

math/
    __init__.py
    arithmetic.py
    geometry.py
    statistics.py

그런 다음 다음과 같이 math 패키지에서 모듈들을 가져올 수 있습니다:

from math.arithmetic import add, subtract
from math.geometry import calculate_area
from math.statistics import mean, median

예외와 에러 처리

파이썬에서 예외는 프로그램 실행 중에 발생하는 오류를 처리하는 방법입니다. try-except 블록을 사용하여 예외를 잡고 처리할 수 있습니다.

다음은 ZeroDivisionError를 처리하는 예제입니다:

def divide(a, b):
    try:
        result = a / b
        print(f"The result is: {result}")
    except ZeroDivisionError:
        print("Error: Cannot divide by zero.")
 
divide(10, 2)  # 출력: The result is: 5.0
divide(10, 0)  # 출력: Error: Cannot divide by zero.

또한 finally 절을 사용하여 예외의 발생 여부와 관계없이 코드를 실행할 수 있습니다:

def open_file(filename):
    try:
        file = open(filename, 'r')
        content = file.read()
        print(content)
    except FileNotFoundError:
        print(f"Error: {filename} not found.")
    finally:
        file.close()
 
open_file('example.txt')

또한, Exception 클래스를 상속하는 새로운 클래스를 만들어 직접 사용자 정의 예외를 정의할 수도 있습니다.

class InvalidInputError(Exception):
    pass
 
def calculate_area(shape, *args):
    if shape == 'rectangle':
        length, width = args
        return length * width
    elif shape == 'circle':
        radius, = args
        return 3.14 * radius ** 2
    else:
        raise InvalidInputError("Invalid shape provided.")
 
try:
    print(calculate_area('rectangle', 5, 10))  # 출력: 50
    print(calculate_area('circle', 3))  # 출력: 28.26
    print(calculate_area('triangle', 3, 4))  # InvalidInputError 발생
except InvalidInputError as e:
    print(e)

파일 입출력 및 경로

파이썬은 파일과 파일 경로를 다루기 위한 내장 함수와 모듈을 제공합니다. 다음은 파일 읽기와 쓰기 예제입니다:

# 파일 쓰기
with open('example.txt', 'w') as file:
    file.write("Hello, World!\n")
    file.write("This is a sample text file.")
 
# 파일 읽기
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # 출력: Hello, World!\nThis is a sample text file.

with 문은 예외가 발생하더라도 작업이 완료된 후 파일이 적절하게 닫히도록 보장하기 위해 사용됩니다.

또한 os 모듈을 사용하여 파일 경로와 디렉토리를 다룰 수도 있습니다:

import os
 
# 현재 작업 디렉토리 얻기
current_dir = os.getcwd()
print(current_dir)
 
# 경로 합치기
file_path = os.path.join(current_dir, 'example', 'file.txt')
print(file_path)
 
# 파일 또는 디렉토리의 존재 여부 확인
if os.path.exists(file_path):
    print("파일이 존재합니다.")
else:
    print("파일이 존재하지 않습니다.")

결론

이 강좌에서는 클래스와 객체 지향 프로그래밍 (OOP), 모듈과 패키지, 예외와 에러 처리 등의 중급 수준의 파이썬 개념을 학습했습니다.

  • 파일 I/O 및 경로

이러한 개념은 보다 복잡하고 견고한 Python 애플리케이션을 구축하는 데 필수적입니다. 이러한 기술을 이해하고 적용함으로써 더 깔끔하고 유지보수가능하며 다재다능한 코드를 작성할 수 있습니다.

Python 기술을 향상시키는 가장 좋은 방법은 이러한 개념을 연습하고 실험하는 것입니다. 자신의 프로젝트에서 이를 구현하고 지속적으로 새로운 것을 배우려고 노력하세요.

코딩 즐겁게하세요!

MoeNagy Dev