python
Python을 사용하여 디렉토리에서 파일 쉽게 검색하기

Python을 사용하여 디렉토리에서 파일 쉽게 검색하기

MoeNagy Dev

Python을 사용하여 디렉토리에서 모든 파일 가져오기

os.listdir()의 힘

os.listdir() 함수 이해하기

os.listdir() 함수는 Python 표준 라이브러리에서 강력한 도구로, 지정된 디렉토리 내의 모든 파일과 디렉토리 목록을 가져올 수 있게 해줍니다. 이 함수는 운영 체제와 상호 작용하는 방법을 제공하는 os 모듈의 일부입니다.

다음은 os.listdir()를 사용하는 기본적인 예시입니다:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
print(file_list)

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

디렉토리에서 모든 파일 가져오기

디렉토리에서 (디렉토리가 아닌) 파일 목록만 가져오려면 다음 접근 방법을 사용할 수 있습니다:

import os
 
directory_path = '/path/to/directory'
file_list = [f for f in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, f))]
print(file_list)

이 예시에서는 os.listdir()가 반환하는 목록을 리스트 컴프리헨션으로 필터링하여 파일 (디렉토리가 아닌)만 포함합니다. 이 때 os.path.isfile() 함수를 사용합니다.

하위 디렉토리 및 재귀적인 파일 가져오기 처리

지정된 디렉토리뿐만 아니라 하위 디렉토리에서도 파일을 가져오려면, 재귀적인 접근 방식을 사용할 수 있습니다. 다음은 예시입니다:

import os
 
def get_all_files(directory_path):
    file_list = []
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            file_list.append(os.path.join(root, file))
    return file_list
 
directory_path = '/path/to/directory'
all_files = get_all_files(directory_path)
print(all_files)

이 예시에서는 os.walk() 함수를 사용하는 get_all_files() 함수를 정의합니다. os.walk() 함수는 디렉토리 트리를 재귀적으로 탐색하기 위해 사용됩니다. 만나는 각 파일에 대해 os.path.join()을 사용하여 전체 파일 경로를 구성하고 file_list에 추가합니다.

확장자별 파일 필터링하기

포함할 파일 확장자 지정하기

특정 파일 확장자만 포함하는 파일을 가져오려면 다음 접근 방식을 사용할 수 있습니다:

import os
 
directory_path = '/path/to/directory'
allowed_extensions = ['.txt', '.py', '.jpg']
 
file_list = [f for f in os.listdir(directory_path) if any(f.endswith(ext) for ext in allowed_extensions)]
print(file_list)

이 예시에서는 allowed_extensions 목록을 정의하고, os.listdir()로 반환된 파일 목록을 목록 컴프리헨션을 사용하여 지정된 확장자를 가진 파일만 포함합니다.

특정 파일 확장자 제외하기

마찬가지로, 목록 컴프리헨션을 수정하여 특정 파일 확장자를 제외할 수 있습니다:

import os
 
directory_path = '/path/to/directory'
excluded_extensions = ['.pyc', '.log']
 
file_list = [f for f in os.listdir(directory_path) if not any(f.endswith(ext) for ext in excluded_extensions)]
print(file_list)

이 예시에서는 excluded_extensions 목록을 정의하고, 목록 컴프리헨션을 사용하여 지정된 확장자가 있는 파일을 제외합니다.

여러 파일 확장자 처리하기

집합(set)이나 사전(dictionary)을 사용하여 유연하게 여러 파일 확장자를 처리할 수도 있습니다:

import os
 
directory_path = '/path/to/directory'
allowed_extensions = {'.txt', '.py', '.jpg'}
 
file_list = [f for f in os.listdir(directory_path) if any(f.endswith(ext) for ext in allowed_extensions)]
print(file_list)

이 예시에서는 목록 대신 집합(set)인 allowed_extensions을 사용합니다. 이를 통해 목록 컴프리헨션을 수정하지 않고도 확장자를 추가하거나 제거할 수 있습니다.

파일 목록 정렬 및 구성하기

파일 목록 알파벳순으로 정렬하기

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

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
sorted_file_list = sorted(file_list)
print(sorted_file_list)

이렇게 하면 파일 목록이 오름차순으로 정렬됩니다.

파일 크기 또는 수정 날짜별로 정렬하기

파일 목록을 파일 크기 또는 수정 날짜별로 정렬하려면 각각 os.path.getsize()os.path.getmtime() 함수를 사용할 수 있습니다:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
 
# 파일 크기별로 정렬
sorted_by_size = sorted(file_list, key=lambda x: os.path.getsize(os.path.join(directory_path, x)))
print(sorted_by_size)
 
# 수정 날짜별로 정렬
sorted_by_date = sorted(file_list, key=lambda x: os.path.getmtime(os.path.join(directory_path, x)))
print(sorted_by_date)

첫 번째 예시에서는 os.path.getsize()를 사용하여 파일 크기를 가져오는 사용자 정의 키 함수와 함께 sorted() 함수를 사용합니다. 두 번째 예시에서는 os.path.getmtime()을 사용하여 가져온 수정 날짜를 정렬 키로 사용합니다.

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

파일을 확장자별로 그룹화하려면 파일을 확장자별로 구분하기 위해 사전을 사용할 수 있습니다:

import os
from collections import defaultdict
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
 
file_groups = defaultdict(list)
for filename in file_list:
    extension = os.path.splitext(filename)[1].lower()
    file_groups[extension].append(filename)
 
for extension, files in file_groups.items():
    print(f"'{extension}' 확장자를 가진 파일: {', '.join(files)}")

In this example, we use a defaultdict from the collections module to create a dictionary that will automatically initialize empty lists for new file extensions. We then iterate through the file list, extract the file extension using os.path.splitext(), and add the filename to the corresponding list in the file_groups dictionary.

Pathlib로 작업하기

Pathlib 모듈 소개

Python에서 pathlib 모듈은 파일 경로를 다루기 위한 객체 지향적인 방법을 제공합니다. 이는 기존의 os.path 모듈에 비해 더 직관적이고 크로스 플랫폼적인 접근 방식을 제공합니다.

Pathlib을 사용하여 파일 목록 나열하기

다음은 pathlib을 사용하여 디렉터리의 파일 목록을 어떻게 나열하는지에 대한 예시입니다:

from pathlib import Path
 
directory_path = '/path/to/directory'
file_list = [p.name for p in Path(directory_path).glob('*')]
print(file_list)

이 예시에서는 pathlib 모듈의 Path 클래스를 사용하여 디렉터리 경로를 나타냅니다. 그런 다음 glob() 메서드를 사용하여 지정된 디렉터리 내의 모든 파일과 디렉터리의 목록을 검색합니다.

Pathlib을 사용하여 파일 메타데이터에 접근하기

pathlib을 사용하여 파일 크기와 수정 날짜와 같은 파일 메타데이터에 쉽게 접근할 수도 있습니다:

from pathlib import Path
 
file_path = '/path/to/file.txt'
file_path = Path(file_path)
 
print(f"파일 이름: {file_path.name}")
print(f"파일 크기: {file_path.stat().st_size} 바이트")
print(f"수정 시간: {file_path.stat().st_mtime}")

이 코드는 pathlib.Path 객체를 사용하여 파일 이름, 파일 크기 및 수정 시간을 어떻게 가져오는지 보여줍니다.

숨겨진 파일 및 디렉터리 다루기

숨겨진 파일 및 디렉터리 식별하기

많은 파일 시스템에서 점으로 시작하는 파일과 디렉터리 (예: .gitignore)는 "숨겨진"으로 간주되며 일반적으로 디렉터리 목록에 표시되지 않습니다. 이러한 숨겨진 항목을 포함하거나 제외하려면 다음 접근 방식을 사용할 수 있습니다:

import os
 
directory_path = '/path/to/directory'
all_items = os.listdir(directory_path)
visible_items = [item for item in all_items if not item.startswith('.')]
hidden_items = [item for item in all_items if item.startswith('.')]
 
print("표시되는 항목:", visible_items)
print("숨겨진 항목:", hidden_items)

이 예시에서는 먼저 os.listdir()를 사용하여 디렉터리의 모든 항목 목록을 가져옵니다. 그런 다음 항목 이름이 점으로 시작하는지 여부를 기준으로 표시되는 항목과 숨겨진 항목을 분리하기 위해 두 개의 리스트 comprehension을 사용합니다.

포함 또는 제외 여부 선택하기

숨겨진 파일과 디렉터리를 포함하거나 제외할지 여부는 사용 사례에 따라 달라질 수 있습니다. 이에 대한 처리 방법 예시는 다음과 같습니다:

import os
 
directory_path = '/path/to/directory'
include_hidden = False
 
all_items = os.listdir(directory_path)
if include_hidden:
    file_list = all_items
else:
    file_list = [item for item in all_items if not item.startswith('.')]
 
print(file_list)

이 예시에서는 숨겨진 항목을 최종 파일 목록에 포함할지 여부를 제어하는 include_hidden이라는 부울 변수를 도입합니다.

파일 검색 동작 사용자 정의하기

포함 또는 제외할 파일과 디렉터리에 대한 사용자 정의 규칙을 지정할 수 있는 함수를 생성하여 파일 검색 동작을 더 사용자 정의할 수도 있습니다:

import os
 
def get_file_list(directory_path, include_hidden=False, allowed_extensions=None, excluded_extensions=None):
    all_items = os.listdir(directory_path)
    file_list = []
 
    for item in all_items:
        item_path = os.path.join(directory_path, item)
        if os.path.isfile(item_path):
            if allowed_extensions:
                if any(item.endswith(ext) for ext in allowed_extensions):
                    file_list.append(item)
            elif excluded_extensions:
                if not any(item.endswith(ext) for ext in excluded_extensions):
                    file_list.append(item)
            else:
                file_list.append(item)
        elif include_hidden or not item.startswith('.'):
            file_list.append(item)
 
    return file_list
 
# 사용 예시
directory_path = '/path/to/directory'
file_list = get_file_list(directory_path, include_hidden=False, allowed_extensions=['.txt', '.py'])
print(file_list)

이 예시에서 get_file_list() 함수는 숨겨진 파일과 디렉터리를 포함할지 여부, 포함 또는 제외할 파일 확장자를 지정할 수 있도록 합니다. 이는 구체적인 요구 사항에 기반하여 파일 목록을 유연하고 사용자 정의 가능한 방식으로 검색할 수 있는 방법을 제공합니다.

os.listdir() 및 os.path.join()의 결합

os.path.join()을 사용하여 전체 파일 경로 구성하기

os.listdir()에서 검색된 파일 목록으로 작업할 때 종종 전체 파일 경로를 구성해야 할 때가 많습니다. 이를 위해 os.path.join() 함수를 사용할 수 있습니다:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
full_file_paths = [os.path.join(directory_path, filename) for filename in file_list]
print(full_file_paths)

이 예시에서는 리스트 컴프리헨션을 사용하여 파일 목록을 반복하고 os.path.join()을 사용하여 디렉터리 경로와 개별 파일 이름을 연결하여 전체 파일 경로를 구성합니다.

디렉터리를 반복하고 파일 목록 구성하기

os.listdir()os.path.join()을 결합하여 더 효율적으로 파일 목록을 구성할 수 있습니다:

import os
 
def get_file_list(directory_path):
    file_list = []
    for filename in os.listdir(directory_path):
        file_path = os.path.join(directory_path, filename)
        if os.path.isfile(file_path):
            file_list.append(file_path)
    return file_list
 
directory_path = '/path/to/directory'
all_files = get_file_list(directory_path)
print(all_files)

이 예시에서 os.listdir()를 사용하여 디렉터리의 항목 중 파일인 경우만 파일 목록에 추가합니다. 리스트는 Python에서 가장 기본적인 데이터 구조 중 하나입니다. 이들은 서로 다른 데이터 유형이 될 수있는 항목의 정렬 된 컬렉션입니다. 대괄호 []를 사용하여 목록을 만들고 쉼표로 항목을 분리하여 목록을 만들 수 있습니다.

fruits = ['사과', '바나나', '체리']
print(fruits)  # 출력 : ['사과', '바나나', '체리']

목록에서 개별 요소에는 0부터 시작하는 인덱스를 사용하여 액세스 할 수 있습니다.

print(fruits[0])  # 출력 : '사과'
print(fruits[1])  # 출력 : '바나나'

목록의 끝에서 요소에 액세스하기 위해 음수 인덱스를 사용할 수도 있습니다.

print(fruits[-1])  # 출력 : '체리'
print(fruits[-2])  # 출력 : '바나나'

목록은 슬라이싱, 연결, 수정 등 다양한 작업을 지원합니다.

# 슬라이싱
print(fruits[1:3])  # 출력 : ['바나나', '체리']
 
# 연결
more_fruits = ['오렌지', '키위']
all_fruits = fruits + more_fruits
print(all_fruits)  # 출력 : ['사과', '바나나', '체리', '오렌지', '키위']
 
# 수정
fruits[0] = '배'
print(fruits)  # 출력 : ['배', '바나나', '체리']

튜플

튜플은 목록과 유사하지만 생성 후 요소를 수정할 수 없는 의미로 불변입니다. 튜플은 대괄호 대신 괄호 ()를 사용하여 정의됩니다.

point = (3, 4)
print(point)  # 출력 : (3, 4)
print(point[0])  # 출력 : 3
print(point[1])  # 출력 : 4

튜플은 좌표 또는 데이터베이스 레코드와 같은 고정된 값 집합을 저장하는 경우 유용 할 수 있습니다.

사전

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

person = {
    'name': '홍길동',
    'age': 35,
    'occupation': '소프트웨어 엔지니어'
}
print(person)  # 출력 : {'name': '홍길동', 'age': 35, 'occupation': '소프트웨어 엔지니어'}

사전에서 키를 사용하여 값을 액세스 할 수 있습니다.

print(person['name'])  # 출력 : '홍길동'
print(person['age'])  # 출력 : 35

사전은 목록 및 다른 사전을 포함하여 다양한 유형의 데이터를 저장하는 데 사용할 수 있습니다.

person = {
    'name': '홍길동',
    'age': 35,
    'hobbies': ['독서', '하이킹', '사진'],
    'address': {
        'street': '123 Main St',
        'city': '도시',
        'state': 'CA'
    }
}
 
print(person['hobbies'])  # 출력 : ['독서', '하이킹', '사진']
print(person['address']['city'])  # 출력 : '도시'

세트

세트는 고유한 요소로 구성된 정렬되지 않은 컬렉션입니다. 중괄호 {}를 사용하여 정의되며 요소는 쉼표로 구분됩니다.

colors = {'빨강', '녹색', '파랑'}
print(colors)  # 출력 : {'빨강', '녹색', '파랑'}

세트를 사용하여 합집합, 교집합 및 차집합과 같은 다양한 작업을 수행 할 수 있습니다.

colors1 = {'빨강', '녹색', '파랑'}
colors2 = {'녹색', '노랑', '주황'}
 
# 합집합
all_colors = colors1 | colors2
print(all_colors)  # 출력 : {'빨강', '녹색', '파랑', '노랑', '주황'}
 
# 교집합
common_colors = colors1 & colors2
print(common_colors)  # 출력 : {'녹색'}
 
# 차집합
unique_colors1 = colors1 - colors2
print(unique_colors1)  # 출력 : {'빨강', '파랑'}

제어 흐름

조건문

Python에서 조건문을 사용하여 특정 조건에 따라 프로그램의 흐름을 제어 할 수 있습니다.

if-elif-else 문은 조건 논리를 구현하는 가장 일반적인 방법입니다.

age = 25
if age < 18:
    print("미성년자입니다.")
elif age < 65:
    print("성인입니다.")
else:
    print("노인입니다.")

또한 단순한 if-else 문을 작성하는 축약형인 삼항 연산자를 사용할 수도 있습니다.

is_student = True
status = "학생" if is_student else "비 학생"
print(status)  # 출력 : "학생"

반복문

Python에서는 코드 블록을 반복적으로 실행할 수있는 두 가지 일반적인 유형의 루프 인 forwhile 루프가 있습니다.

for 루프는 목록이나 문자열과 같은 시퀀스를 반복하는 데 사용됩니다.

fruits = ['사과', '바나나', '체리']
for fruit in fruits:
    print(fruit)

while 루프는 특정 조건이 참인 경우에만 코드 블록을 반복적으로 실행하는 데 사용됩니다.

count = 0
while count < 5:
    print(count)
    count += 1

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

for i in range(10):
    if i == 5:
        break
    print(i)  # 출력 : 0 1 2 3 4
 
for j in range(10):
    if j % 2 == 0:
        continue
    print(j)  # 출력 : 1 3 5 7 9

함수

Python에서 함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. def 키워드를 사용하여 정의됩니다.

def greet(name):
    print(f"안녕하세요, {name}!")
 
greet("앨리스")  # 출력 : "안녕하세요, 앨리스!"

함수는 return 문을 사용하여 값을 반환할 수도 있습니다.

def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 출력 : 7

또한 기본 매개 변수 값 및 가변 길이 인수를 사용하여 함수를 정의 할 수도 있습니다.

def print_info(name, age=30, *args):
    print(f"이름 : {name}")
    print(f"나이 : {age}")
    print("추가 정보:")
    for arg in args:
        print(arg)
 
print_info("존", 35, "소프트웨어 엔지니어", "하이킹을 좋아합니다")

모듈 및 패키지

Python에서 코드를 모듈과 패키지로 구성하여 코드의 모듈성 및 재사용성을 높일 수 있습니다.

모듈은 기능, 클래스 및 변수를 포함하는 단일 Python 파일입니다. import 문을 사용하여 모듈을 가져올 수 있습니다.

import math
print(math.pi)  # 출력 : 3.141592653589793

또한 from 키워드를 사용하여 모듈에서 특정 항목을 가져올 수도 있습니다.

from math import sqrt
print(sqrt(16))  # 출력 : 4.0

패키지는 관련된 모듈의 컬렉션입니다. 이들은 패키지를 정의하는 __init__.py 파일을 포함하는 디렉토리로 구성됩니다.

my_package/
__init__.py
    module1.py
    module2.py

패키지의 항목을 점 표기법을 사용하여 가져올 수 있습니다.

```python
import my_package.module1
result = my_package.module1.my_function()

예외 처리

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

try-except 문을 사용하여 예외를 처리하고 처리할 수 있습니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("오류: 0으로 나눌 수 없습니다.")

여러 예외를 처리하고 기본 except 블록을 제공할 수도 있습니다.

try:
    num = int(input("숫자를 입력하세요: "))
    print(10 / num)
except ValueError:
    print("오류: 잘못된 입력입니다.")
except ZeroDivisionError:
    print("오류: 0으로 나눌 수 없습니다.")
except:
    print("알 수 없는 오류가 발생했습니다.")

raise 문을 사용하여 직접 예외를 발생시킬 수도 있습니다.

def withdraw(balance, amount):
    if amount > balance:
        raise ValueError("잔액이 부족합니다.")
    return balance - amount
 
try:
    new_balance = withdraw(100, 150)
except ValueError as e:
    print(e)

결론

이 자습서에서는 파이썬에서 다양한 데이터 구조, 제어 흐름 문장, 함수, 모듈 및 예외 처리에 대해 배웠습니다. 이 개념들은 보다 복잡하고 견고한 파이썬 애플리케이션을 구축하기 위해 필수적입니다. 제공된 예제를 연습하고 실험하여 이러한 주제에 대한 이해를 확고히 해보세요.

MoeNagy Dev