반응형

약 12만개 이미지 데이터에서 특정 번호를 기준으로 파일들을 분류하려고 하니, 하나씩 수작업으로 하기에는 너무 시간이 오래 걸리고 사람이 할게 못된다. 100개 정도면 할 수 있겠다만, 이게 12만개가 되다 보니 분류하기에는 엄청 빡세다. 다행히도, 파이썬을 이용하여 이 숫자들을 기준으로 폴더를 만들어 그 안에 분류를 할 것이다.

 

1. 라이브러리

라이브러리는 총 4개를 사용할 것이다.

> pandas : csv 파일 가져오기 위해 사용

> os : 특정 폴더를 생성을 위해 사용

> glob : 특정 폴더의 경로를 추출하기 위해 사용

> shutil : 특정 폴더에 있는 이미지 파일을 복사하기 위해 사용

import pandas as pd # CSV 파일 가져오기 위함
import os # 특정 폴더 생성
import glob # 경로 가져오기
import shutil # 파일 복사

 

 

2. CSV 데이터 가져오기

pandas 라이브러리 사용하여 csv 파일 데이터를 읽어와서 데이터프레임 형식으로 저장한다.

origin_df_csv = pd.read_csv('C:/Users/TEST/Desktop/Num.csv')

 

 

3. CSV 데이터에서의 각 컬럼 데이터 가져오기

CSV 파일에는 NUM1, NUM2라는 2개의 컬럼으로 이루어진 데이터로 구성되어 있다. 여기서, NUM1은 NUM2를 1:N 구조로 포함하고 있어 NUM1로 특정 폴더를 생성하고, NUM1에 각 NUM2 파일들을 넣을 것이다.

# NUM1, NUM2 List 정의
num1List = origin_df_csv['NUM1']
num2List = origin_df_csv['NUM2']

 

 

4. 경로 추출하기

glob 라이브러리를 사용하여 로컬디스크 C에 새폴더에 imageHeader라는 폴더에 있는 모든 파일의 경로들을 pathList에 저장한다.

# 0. 해당 위치 경로 가져오기
pathList = glob.glob('C:/새 폴더/imageHeader/*');

 

 

5. 로직 짜기

> 탐색할 경로 : C:/새 폴더/imageHeader에 있는 모든 파일

> 복사할 경로 : C:/새 폴더/imageHeader/seper 폴더 밑에 NUM1로 만들어진 폴더를 생성하고, NUM1 폴더가 포함하고 있는 NUM2 이미지 파일 복사

> 특정 NUM1 폴더가 있으면 NUM2 파일을 NUM1 폴더 안에 복사 후 붙여 넣고, 특정 NUM1 폴더가 없으면 NUM1 폴더명으로 폴더를 생성하고, 그 안에 NUM2 파일을 복사 후 붙여 넣는다.

# 1. NUM1, NUM2 가져오기
for num1, num2 in zip(num1List, num2List) : 
    num1 = str(num1)
    num2 = str(num2)
    
    for path in pathList : 
        # 1-1. 현재 경로의 하위 경로 설정
        path = path + '/*'
        
        # 1-2. 현재 경로의 하위 경로에 있는 이미지 파일명 가져오기 
        for imagePath in glob.glob(path) : 
            if num2 in imagePath :
                sign = 0
                # 특정 경로에 num1로 되어 있는 폴더가 있는 경우에는 이미지를 복사 후 붙여넣고,
                # 폴더가 없는 경우에는 폴더 생성 후 이미지 복사 후 붙여 넣는다.
                for folderPath in glob.glob('C:/새폴더/imageHeader/seper/*') : 
                    if num1 in folderPath : 
                        shutil.copy(imagePath, folderPath)
                        sign = 1
                        break
                
                if sign == 0 : 
                    tempPath = 'C:/새폴더/imageHeader/seper/'
                    tempPath += num1
                    os.mkdir(tempPath)
                    shutil.copy(imagePath, tempPath)

 

 

6. 최종코드

import pandas as pd # CSV 파일 가져오기 위함
import os # 특정 폴더 생성
import glob # 경로 가져오기
import shutil # 파일 복사

origin_df_csv = pd.read_csv('C:/Users/TEST/Desktop/Num.csv')

# NUM1, NUM2 List 정의
num1List = origin_df_csv['NUM1']
num2List = origin_df_csv['NUM2']

# 0. 해당 위치 경로 가져오기
pathList = glob.glob('C:/새 폴더/imageHeader/*')

# 1. NUM1, NUM2 가져오기
for num1, num2 in zip(num1List, num2List) : 
    num1 = str(num1)
    num2 = str(num2)
    
    for path in pathList : 
        # 1-1. 현재 경로의 하위 경로 설정
        path = path + '/*'
        
        # 1-2. 현재 경로의 하위 경로에 있는 이미지 파일명 가져오기 
        for imagePath in glob.glob(path) : 
            if num2 in imagePath :
                sign = 0
                # 특정 경로에 num1로 되어 있는 폴더가 있는 경우에는 이미지를 복사 후 붙여넣고,
                # 폴더가 없는 경우에는 폴더 생성 후 이미지 복사 후 붙여 넣는다.
                for folderPath in glob.glob('C:/새폴더/imageHeader/seper/*') : 
                    if num1 in folderPath : 
                        shutil.copy(imagePath, folderPath)
                        sign = 1
                        break
                
                if sign == 0 : 
                    tempPath = 'C:/새폴더/imageHeader/seper/'
                    tempPath += num1
                    os.mkdir(tempPath)
                    shutil.copy(imagePath, tempPath)
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기