ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 파일 경로 다루기: os.path.join(), os.listdir(), r'', 리스트 컴프리헨션 완벽 정리
    pandas 2025. 7. 17. 16:12

    파이썬으로 로컬 파일을 다룰 때 파일 경로는 가장 기본적이면서도 실수를 유발하기 쉬운 부분입니다. 이 글에서는 파일 경로를 정확하고 효율적으로 처리하는 세 가지 핵심적인 방법을 정리합니다.

    1. 백슬래시(\) 문제와 Raw String(r'')

    윈도우 운영체제에서는 경로 구분자로 백슬래시(\)를 사용합니다. 하지만 파이썬 문자열에서 \는 뒤따라오는 문자와 결합하여 특별한 의미를 갖는 '이스케이프 시퀀스(Escape Sequence)'로 사용됩니다.

    • \n: 줄바꿈
    • \t: 탭
    • \U: 유니코드 이스케이프 시작

    이 때문에 윈도우 경로를 문자열에 그대로 사용하면 의도치 않은 오류가 발생합니다.

     

    - 문제 발생 예시

    Generated python

    # \U, \n 등 이스케이프 시퀀스로 해석되어 SyntaxError 또는 잘못된 경로를 생성
    path = "C:\Users\new_folder\data.csv"

     

    - 해결 방법: Raw String (r'')
    문자열 앞에 r을 붙이면, 파이썬은 해당 문자열 내부의 모든 문자를 특수 기능 없이 있는 그대로의 '날것(Raw)'으로 인식합니다. 이는 윈도우 경로를 가장 간단하고 안전하게 처리하는 방법입니다.

    Generated python

    # r''을 사용하여 문자열을 있는 그대로 처리
    path = r"C:\Users\new_folder\data.csv"

     

    ※ 참고: \를 두 번 연속으로 쓰는 path = "C:\\Users\\new_folder\\data.csv" 방식도 가능하지만, r''을 사용하는 것이 더 간결하고 가독성이 높습니다.


    2. 안정적인 경로 결합: os.path.join()

    서로 다른 운영체제(Windows, macOS, Linux)는 각기 다른 경로 구분자(\, /)를 사용합니다. 코드의 호환성을 높이고 경로 결합 시 발생할 수 있는 실수를 방지하기 위해 os.path.join()을 사용해야 합니다.

    os.path.join()은 코드가 실행되는 OS 환경을 자동으로 감지하여 올바른 구분자로 경로들을 결합합니다.

     

    - 단순 문자열 결합(+)의 문제점

    Generated python

    folder = "C:\\my_folder\\"
    file = "data.csv"
    
    # 불필요한 구분자 중복 발생
    bad_path = folder + "\\" + file
    print(bad_path) # 출력: C:\my_folder\\data.csv

     

    - os.path.join() 사용 예시
    os.path.join()은 경로 사이에 구분자가 없으면 추가하고, 중복되면 하나로 정리하여 항상 올바른 형태의 경로를 생성합니다.

    Generated python

    import os
    
    folder1 = r"C:\my_folder"      # 구분자가 없는 경우
    folder2 = r"C:\my_folder\"     # 구분자가 이미 있는 경우
    file = "data.csv"
    
    path1 = os.path.join(folder1, file)
    path2 = os.path.join(folder2, file)
    
    print(path1) # 출력: C:\my_folder\data.csv
    print(path2) # 출력: C:\my_folder\data.csv

    따라서 코드의 안정성과 이식성을 위해 경로를 합칠 때는 항상 os.path.join()을 사용하는 것이 표준입니다.


    3. 특정 파일만 필터링하기: List Comprehension

    특정 디렉토리 내에서 .csv 확장자를 가진 파일 목록만 가져오는 등, 조건에 맞는 파일만 필터링해야 할 때가 많습니다. 이때 os.listdir()와 리스트 컴프리헨션(List Comprehension)을 결합하면 매우 효율적입니다.

    os.listdir(path)는 해당 경로의 모든 파일 및 폴더 이름을 리스트로 반환합니다.

     

    - 사용 예시
    다음 코드는 folder_path 디렉토리에서 이름이 .csv로 끝나는 모든 파일의 목록을 생성합니다.

    Generated python

    import os
    
    folder_path = r'C:\project\data'
    
    # List Comprehension을 사용해 .csv 파일만 필터링
    csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
    
    print(csv_files)
    # 출력 예시: ['data1.csv', 'sales.csv', 'report_final.csv']

     

    - 코드 분석
    [f for f in os.listdir(folder_path) if f.endswith('.csv')]

    1. for f in os.listdir(folder_path): folder_path 내의 모든 항목(f)을 순회합니다.
    2. if f.endswith('.csv'): 각 항목의 이름이 .csv로 끝나는지 검사합니다.
    3. f: 조건이 참(True)인 항목 f만 선택합니다.
    4. [...]: 선택된 항목들을 모아 새로운 리스트를 만듭니다.

    심화: 왜 pandas.read_csv \ 경로를 그냥 읽기도 할까?

    간혹 pd.read_csv("C:\data\sales.csv")와 같이 r'' 없는 경로가 오류 없이 동작하는 경우가 있습니다.

    이는 파이썬이 \d, \s처럼 정의되지 않은 이스케이프 시퀀스를 만나면, 이를 무시하고 \와 해당 문자로 분리해서 해석하기 때문입니다. 즉, 우연히 경로 내에 \n, \t, \r, \U 등 정의된 이스케이프 시퀀스가 없었기 때문에 동작한 것입니다.

    만약 경로가 C:\Users\new_data.csv였다면 \n이 줄바꿈으로 해석되어 100% 오류가 발생합니다. 따라서 이 동작은 신뢰할 수 없으며, 항상 r'' 또는 /를 사용하여 경로를 명확히 지정해야 합니다.

     

    ⭐ 최종 결론 ⭐

    앞으로 파이썬에서 파일이나 폴더 경로를 다룰 때는, 무조건 os.path.join()을 사용하는 습관을 들이시는 것이 좋습니다.

    실수를 줄여주고, 내 코드를 더 전문적이고 안정적으로 만들어주는 최고의 방법입니다.

Designed by Tistory.