파이썬 프로그래밍 시
폴더 내 파일목록을 읽을 때 string으로 읽힌다.
이때 read zero가 아닌 파일*은 아래와같이 더럽게 솔트되는 경우가 있다.
*read zero X: 1, 2, 3, ...,10, 11, 12
O: 01, 02, 03, ...,10, 11, 12
/home/99_EXT_DATAS/UV_1.nc
/home/99_EXT_DATAS/UV_10.nc
/home/99_EXT_DATAS/UV_11.nc
/home/99_EXT_DATAS/UV_12.nc
/home/99_EXT_DATAS/UV_2.nc
/home/99_EXT_DATAS/UV_3.nc
/home/99_EXT_DATAS/UV_4.nc
/home/99_EXT_DATAS/UV_5.nc
/home/99_EXT_DATAS/UV_6.nc
/home/99_EXT_DATAS/UV_7.nc
/home/99_EXT_DATAS/UV_8.nc
/home/99_EXT_DATAS/UV_9.nc
원하기는 UV_1 다음 UV_2가 오면 좋겠는데, UV_10이 오게 된다.
이유는 string으로 순서가 정해지다보니 빨리오는 string 값을 기준으로 정렬되는 것이다.
그러니까 빨간글씨만 보면 10이 2보다 먼저오는게 맞는것이다...UV_1, UV_10, UV_2
어쨋든 이를 위해서
01. 기준이 될 문자를 추출하고
02. 그 기준으로 다시 정렬하면 된다.
그럼 이제 알아보자.
파이썬 칫싯(Python CheatSheet): sort + replace + split
I. 라이브러리 설치
먼저, 사용되는 라이브러리는 sort, replace, split 이다.
아나콘다를 통해 파이썬 버전을 설치하셨다면 기본적으로 깔리는 것으로 알지만,
라이브러리를 가지고 있지 않는 사람은 커맨드(cmd)창*에서 다운 받을 수 있도록 한다.
*cmd창은 [윈도우키+R] 단축키를 눌러 cmd를 실행시키면 된다.
pip install sort replace rename
conda install sort replace rename
II. 라이브러리 호출 및 사용
바로 예제를 통해 설명하면 다음과 같다.
전체 함수는 다음과 같다.
import glob
files = glob.glob("home/99_EXT_DATAS/*")
sorted_files = sorted(files, key=lambda x : int(x.replace('.','_').split('_')[-2]))
1. glob함수
print(files)
>> /home/99_EXT_DATAS/UV_1.nc
/home/99_EXT_DATAS/UV_10.nc
/home/99_EXT_DATAS/UV_11.nc
/home/99_EXT_DATAS/UV_12.nc
/home/99_EXT_DATAS/UV_2.nc
/home/99_EXT_DATAS/UV_3.nc
/home/99_EXT_DATAS/UV_4.nc
/home/99_EXT_DATAS/UV_5.nc
/home/99_EXT_DATAS/UV_6.nc
/home/99_EXT_DATAS/UV_7.nc
/home/99_EXT_DATAS/UV_8.nc
/home/99_EXT_DATAS/UV_9.nc
폴더 내 파일의 주소를 읽어오는 함수이다. 읽어온 파일은 문자 기준으로 나열되어 위와 같은 순서가 된다.
2. 복잡하게 생긴 아래 코드를 뜯어보자
sorted(files, key=lambda x : int(x.replace('.','_').split('_')[-2]))
2.1 sorted(리스트, key)
sorted함수에 list부분은 나열 순서를 바꿔줄 대상을, key는 순서를 바꾸는 기준을 제시하는 입력이다.
2.2 lambda 함수 (lambda x : ...)
코드 한줄로 간단한 함수를 만들어주는 lambda가 key 값에 입력되었는데,
python 코딩시 코드 길이를 줄여줄 수 있으니 익혀두길 바란다.
즉 키로 x가 입력으로 들어가는 함수의 값을 사용하겠다는 것인데
그 기준은 x를 이용해 만든 int(x.replace('.','_').split('_')[-2]) 가 된다.
2.3 replace, split
x는 files의 한 요소요소를 불러오게되는데,
한 요소를 "."을 "_"로 바꿔주고, split을 통해 '_'을 기준으로 식을 나눠준다. 그리고 정수로 바꿔주는 것이다.
# x는 files의 요소니까 files[0]을 기준으로 보자.
x = files[0]
print(x)
> "/home/99_EXT_DATAS/UV_1.nc"
# replace함수를 통해 .을 _로 바꾸면,
x1 = x.replace('.','_')
print(x1)
> "/home/99_EXT_DATAS/UV_1_nc"
# 이 결과를 split을 통해 _로 나눠주면
x2 = x1.split("_")
print(x2)
> ["/home/99","EXT","DATAS/UV","1","nc"]
# 이 중 우리가 순서나열 기준으로 정한 부분은 "1" 부분이고 이를 정수로 바꿔야한다.
# 정수로 바꾸지 않은면 다시 문자열 기준으로 나열되기에 결과는 그냥 sort한 결과와 같게 된다.
print(int(x2[-2]))
> 1
III. 카피해가세요
import glob
files = glob.glob("home/99_EXT_DATAS/*")
sorted_files = sorted(files, key=lambda x : int(x.replace('.','_').split('_')[-2]))
print(files)
>> /home/99_EXT_DATAS/UV_1.nc
/home/99_EXT_DATAS/UV_10.nc
/home/99_EXT_DATAS/UV_11.nc
/home/99_EXT_DATAS/UV_12.nc
/home/99_EXT_DATAS/UV_2.nc
/home/99_EXT_DATAS/UV_3.nc
/home/99_EXT_DATAS/UV_4.nc
/home/99_EXT_DATAS/UV_5.nc
/home/99_EXT_DATAS/UV_6.nc
/home/99_EXT_DATAS/UV_7.nc
/home/99_EXT_DATAS/UV_8.nc
/home/99_EXT_DATAS/UV_9.nc
print(sorted_files)
>> /home/99_EXT_DATAS/UV_1.nc
/home/99_EXT_DATAS/UV_2.nc
/home/99_EXT_DATAS/UV_3.nc
/home/99_EXT_DATAS/UV_4.nc
/home/99_EXT_DATAS/UV_5.nc
/home/99_EXT_DATAS/UV_6.nc
/home/99_EXT_DATAS/UV_7.nc
/home/99_EXT_DATAS/UV_8.nc
/home/99_EXT_DATAS/UV_9.nc
/home/99_EXT_DATAS/UV_10.nc
/home/99_EXT_DATAS/UV_11.nc
/home/99_EXT_DATAS/UV_12.nc
'Engineer > 프로그래밍관련' 카테고리의 다른 글
공식문서로 iOS 개발 배우기 (0) | 2022.11.11 |
---|---|
윈도우에 리눅스 개발 환경 구축 - 1. WSL 설치 (0) | 2021.07.20 |
CUDA, Tensorflow-gpu 오류 (0) | 2020.07.29 |
OpenMPI Error (0) | 2020.06.05 |
파이썬 칫싯, datetime : 임시버전관리, 실행 날짜 및 시간 출력 방법 (0) | 2020.05.27 |
댓글