약 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)
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 빠른 입출력(sys 모듈) (0) | 2023.12.27 |
---|---|
[백준] 백준 30394번 회전하지 않는 캘리퍼스 파이썬(Python) (0) | 2023.12.14 |
[Python] 파이썬 출력함수 print() 사용법 및 예제 (1) | 2023.12.13 |
[Python] 파이썬(Python) datetime 모듈로 날짜, 시간 처리하는 방법 (0) | 2023.12.07 |
[Python] 파이썬(Python) 엑셀 데이터 불러오는 방법(xlsx, csv) (0) | 2023.11.10 |
[Python] 파이썬(Python) SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 문제 해결 방법 (0) | 2023.11.10 |
[Python] 파이썬(Python) 리스트 다중 문자열 포함 여부 확인하기(all, any) (0) | 2023.10.30 |
[Python] Python YOLO(You Only Look Once) 구현하기 (0) | 2023.09.21 |
최근댓글