본문 바로가기
Engineer/프로그래밍관련

파이썬 칫싯, sort + replace + split

by _제이빈_ 2020. 10. 25.

파이썬 프로그래밍 시

폴더 내 파일목록을 읽을 때 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_1UV_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
반응형

댓글