기다려주세요
도도동짱
전체 방문자
오늘
어제
  • 전체보기 (65)
    • Diary - Life (9)
    • Diary - IT (7)
    • Data Science (6)
    • CS & Programming (20)
    • Debugging (3)
    • Papers (10)
    • Project (3)
    • Lecture (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • Github
  • Instagram

공지사항

  • 김동혁입니다 :)

인기 글

태그

  • 일상
  • GIT
  • 개발
  • Linux
  • weakly supervised semantic segmentation
  • 네이버 개발자 오픈클래스
  • Deep learning
  • 디버깅
  • weakly supervised learning
  • gpt4
  • segmentation
  • attribution method
  • 투자
  • 에러
  • python
  • WSSS
  • 빅데이터
  • 프로그래밍
  • 취업
  • joblib
  • numpay
  • 파이썬
  • 우분투
  • 프로젝트
  • ubuntu
  • polyp segmentation
  • Transformer
  • 회고
  • 리눅스
  • 알고리즘

최근 댓글

최근 글

기다려주세요

Data Science

python natsort로 파일을 "이름 순으로" 정렬해보자

2022. 4. 25. 17:19

python으로 데이터를 다룰 때 파일 경로의 리스트를 읽어오는 불러오는 경우가 많습니다. 저는 파일 이름을 순서대로 정렬해 가져와야 했습니다. 이 단순한 작업이 겉으로는 쉬워 보이지만, 처음에는 많이 헤매었습니다. 그래서 해결방법을 공유하고자 합니다.

 

시간이 없으신 분들은 가장 아래 코드만 보시면 됩니다.


파일 경로를 리스트로 받아올 때 문제점

예시 폴더에 1부터 22까지 번호가 매겨진 jpg 파일을 넣어놓았습니다.

data
- 1.jpg
- 2.jpg
- 3.jpg
...
- 20.jpg
- 21.jpg
- 22.jpg

 

python 내에서 이 파일들의 경로를 순차적으로 가져오기위해 os.listdir를 이용해봅니다.

import os
a = os.listdir('data')
print(sorted(a))

그럼 결과값은 다음과 같습니다.

['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg', '21.jpg', '22.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg']

이상한 점을 눈치채셨나요? 내부적으로 제일 왼쪽 글자부터 정렬하다 보니 1 다음에 2가 아닌 10, 11이 먼저 왔습니다. 이번엔 경로를 다루는 다른 패키지 glob을 사용해보겠습니다.

import glob
a = glob.glob('data/*.jpg')
print(sorted(a))
['data/0.jpg', 'data/1.jpg', 'data/10.jpg', 'data/11.jpg', 'data/12.jpg', 'data/13.jpg', 'data/14.jpg', 'data/15.jpg', 'data/16.jpg', 'data/17.jpg', 'data/18.jpg', 'data/19.jpg', 'data/2.jpg', 'data/20.jpg', 'data/21.jpg', 'data/22.jpg', 'data/3.jpg', 'data/4.jpg', 'data/5.jpg', 'data/6.jpg', 'data/7.jpg', 'data/8.jpg', 'data/9.jpg']

역시나 마찬가지로 원하는 결과가 나오지 않습니다.

 

여기서 아마 sorted(a)에 key 파라미터로 정렬 기준을 설정하시는 분들이 많으실 겁니다. 예를들어 아래와 같이 말이죠.

import os
a = os.listdir('data')
print(sorted(a, key=lambda x: int(x.split('.')[0])))
['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '20.jpg', '21.jpg', '22.jpg']

이렇게 하니 원하는 결과가 나왔습니다! 그러나 이건 어디까지나 파일명이 오로지 숫자만으로 이루어졌을 때만 가능합니다. 파일명에 접두어나 접미어가 붙거나, 여러 디렉터리의 데이터를 모두 불러올 때에는 key에 어떻게 함수를 입력해야 할지 생각만 해도 어질어질합니다.

 

 

해결방법

python의 natsort 라이브러리를 이용해봅시다.

pip install natsort
#pip3 install natsort
import os
import natsort

a = os.listdir('data')
print(natsort.natsorted(os.listdir('data')))
['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '20.jpg', '21.jpg', '22.jpg']

이렇게 하면 원하는 결과가 나옵니다. 파일 이름에 접두어나 접미어가 붙어도 상관없습니다.

['a-0.jpg', 'a-1.jpg', 'a-21.jpg', 'a-22.jpg', 'b-17.jpg', 'b-18.jpg', 'b-19.jpg', 'b-20.jpg']

 

저작자표시 동일조건

'Data Science' 카테고리의 다른 글

Attibution Method에 대하여  (4) 2022.12.28
python split-folders로 이미지 데이터 분리하기 (train/val/test)  (0) 2022.03.24
TPOT을 이용한 머신러닝 자동화 (AutoML with python), 파라미터 튜닝까지  (0) 2021.12.15
pandas dataframe에서 apply의 진척도 보기 (progress_apply())  (2) 2021.09.13
python numpy - argsort() 정렬 전 인덱스 활용하기  (0) 2021.01.08
도도동짱
Working on it, Walking on IT
Designed By 정상우.

티스토리툴바