티스토리 뷰

반응형

0. 폴더 검색?

 

프로그램을 개발할 때 종종 폴더를 검색해 파일을 수정하는 경우가 발생합니다. 그러나 파일이 하나일 경우에는 크게 문제가 없지만, 파일이 여러 개일 경우 어떻게 해야할 까요? 이번 포스트에서는 하나의 폴더를 선택해서, 그 폴더 안에 있는 파일리스트를 읽어와 데이터프레임을 저장, 출력하는 방법에 대해서 알아보도록 하겠습니다. 

 

1. 폴더내 파일 검색

 

파일을 검색하기 위해서는 os 라이브러리를 활용해야 합니다. os에는 파일관련 여러가지 메소드가 있습니다. "백문이 불여일견" 아래 코드를 보고 하나씩 하나씩 살펴보도록 하겠습니다. 

 

[소스코드]

import pandas

import os

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

#파일명 출력하기

for file in files :

    print(file)

 

os.listdir()을 이용하면, 지정한 디렉토리에 있는 파일과 폴더 이름을 가져 옵니다. 이를 for문을 통해 출력을 하면, 아래와 같이 파일이 출력되는 결과를 확인하실 수 있습니다. 

 

조금 아쉬운 부분이 남습니다. 출력된 결과가 파일인지 폴더인지 정확하게 표현되면 더 좋을 것 같은데. 어떻게 해야할 까요? 여기서는 os.pah.isdir()를 사용합니다. 

 

[소스코드]

import pandas

import os

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

#디렉토리인지 아닌지 검토하기

for file in files :

    if os.path.isdir(file) :

        print(file + '\t' + 'directory')    

    else :

        print(file + '\t' + 'file')

 

출력결과는 아래와 같습니다. 위와 같이 directory와 file로 구분되어 출력되는 것을 확인할 수 있습니다. 

그럼 이번에는 파일일 경우 확장자를 구분하고, 파일이름과 파일 확장자를 구분해서 출력하는 코드를 작성하겠습니다. 아래와 같은 결과가 나오게 말이죠. 이렇게 출력하기 위해서는 os.path.splitext() 메소드를 활용해야만 합니다. 

 

소스코드를 살펴보겠습니다. 

 

[소스코드]

import pandas

import os

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

#파일일 경우 출력을 하고, 확장자를 구분하기

for file in files :

    if os.path.isdir(file) == False:

       name, ext = os.path.splitext(file)

       print(file + '\t' + ext)

 

os.path.splitext를 이용하면, 복잡하지 않게 구현이 파일과 확장자를 구분할 수 있습니다.

 

디렉토리를 포함한 이름 불러오기

 

앞서 수행한 코드는 이름을 파일 불러오는 것만을 했습니다. 본 절에서는 디렉토리 전체 이름을 가져오는 방법에 대해서 알아보겠습니다. 이를 위해서는 os.path.join 함수를 이용해야합니다. dir, file을 파라미터로 입력하면 완성!

 

[소스코드]

import pandas

import os

 

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

for file in files : 

    fullname_file = os.path.join(dir, file)

    print(fullname_file)

 

실행결과를 살펴볼까요?

 

자~ 전체 디렉토리 정보가 잘 보이시죠?

 

2. 재귀함수 호출을 통한 하위 폴더의 파일을 모두 출력하는 방법

 

현재까지의 예제는 폴더 내에 존재하는 하위 디렉토리를 검색하지 않았는데요. 이번 예시에서는 하위 폴더의 파일도 같이 검색하는 방법에 대해서 알아보도록 하겠습니다. 

 

이를 위해서는 재귀함수에 대한 이해가 좀 필요한데요. 재귀함수는 함수가 함수를 호출해 반복적으로 동작하도록 하는 프로그래밍 기법입니다. 관련한 내용은 나중에 알고리즘 카테고리를 신설해서 다시 다뤄보도록 하겠습니다. 자 이제 아래코드를 통해서 하위 폴더의 파일을 모두 출력해보겠습니다. 

 

[소스코드]

 

import pandas

import os

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

#재귀호출을 통해 하위디렉토리 파일정보 읽기

def file_search(dir) :

    files = os.listdir(dir)

    for file in files : 

        fullname_file = os.path.join(dir, file)

        if os.path.isdir(fullname_file) : 

            file_search(fullname_file)

        else :

            print(fullname_file)

 

#재귀함수를 통해 하위파일까지 검색

file_search(dir)

 

이렇게 하면 다음과 같이 출력이 나타납니다. 우측이 실행결과로, 이전의 실행결과와 다르게 나타나는 것을 확인 하실 수 있습니다. 

 

자 그럼 파일명, 이름, 확장자, 디렉토리를 포함하는 위치정보로, 출력을 해보도록 하겠습니다. 

 

[소스코드]

 

import pandas

import os

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

def file_search(dir) :

    files = os.listdir(dir)

    for file in files : 

        fullname_file = os.path.join(dir, file)

        if os.path.isdir(fullname_file) : 

            file_search(fullname_file)

        else :

            name, ext = os.path.splitext(file)

            print(file + '\t' + name + '\t' + ext + '\t' + fullname_file + '\t')

 

출력을 확인해볼까요? 

이제는 이것을 딕셔너리 자료구조로 저장하면 다음과 같이 작성이 되어야 합니다. 

 

3. 파일정보를 데이터프레임으로 옮기기

 

이제 마지막, 2절에서 작성한 내용을 파일명, 이름, 확장자, 디렉토리라는 데이터프레임으로 결과를 옮겨 저장하는 방법에 대해서 알아보겠습니다. 다시말해, 폴더를 지정하면, 하위 존재하는 폴더를 포함 전체의 파일 정보를 데이터 프레임에 저장하는 방법에 관한 것입니다.

 

이 방법에 알아야 하는 것은 아래와 같습니다. 

 

첫째, 데이터프레임의 전역변수화 및 초기화

둘째, 데이터프레임에 하나씩 입력

셋째, 리턴을 통해 전역변수인 데이터프레임 계속 증분

 

소스 코드를 보면서 작성하는 방법에 대해서 알아보도록 하겠습니다. 

 

[소스코드]

import pandas

import os

dir = 'C:/Users/Jeatek/Desktop/Python Project'

files = os.listdir(dir)

 

global dataframeFile #데이터프레임의 전역화

 

#데이터프레임초기화

dataframeFile  = pandas.DataFrame(index=range(0,0), columns=['파일명','이름','확장자','위치정보']) 

 

def file_search(dir, dataframeFile) :

    files = os.listdir(dir)

    for file in files : 

        fullname_file = os.path.join(dir, file)

        if os.path.isdir(fullname_file) : 

            dataframeFile = file_search(fullname_file, dataframeFile)  #재귀함수 호출

        else :

            name, ext = os.path.splitext(file)            

            dic_file = {'파일명':file, '이름':name, '확장자':ext, '위치정보':fullname_file}

            dataframeFile = dataframeFile.append(dic_file, ignore_index = True)

 

    #데이터프레임 리턴

    return dataframeFile

    

#재귀함수 호출

dataframeFile = file_search(dir,dataframeFile)

#데이터프레임 결과출력

print(dataframeFile)

 

소스에 대한 결과를 확인해 볼까요?

4. 맺음말

 

이번 포스트에선 파일정보를 os 라이브러리를 이용해서, 지정한 폴더에서 파일정보를 읽어 데이터 프레임에 저장하는 방법에 대해서 알아보았습니다. 이 부분은 사실 나중에 폴더 내 파일내용을 하나로 합칠때 매우 유용하게 이용될 수 있습니다. 

 

코드라는 부분이 사실 할 때는 하나하나 간단해 보이지만, 이러한 코드들이 연계가 되면 매우 큰힘을 발휘합니다. 다음 포스트에서는 이를 활용한 예제를 하나 더 소개해보도록 하겠습니다. 그럼 오늘도 열공하시고, 계속많은 관심부탁드립니다. 

 

여러분의 구독과 좋아요는 포스트를 작성하는데 많은 도움이 됩니다. 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함