2. 해외선물/2-6. 기타자료 (파이썬 함수 등)

(파이썬) 엑셀 내용을 파이썬에서 출력하기 (4) openpyxl을 통해 특정열의 갯수 카운팅 및 빈칸 없애기

봄이오네 2023. 11. 16. 08:07
반응형

 

목 차
1. 들어가며
2. 사전설명
3. 코드설명
4. 마치며

 

1. 들어가며

지난 글에서는 엑셀의 R1C1 셀주소 형태를 통해 엑셀의 데이터를 파이썬에 출력해보았다. R1C1 셀주소는 유용하게 사용될 것이다. 동적으로 제공되는 데이터에 대해 유연하게 대비하려면 R1C1의 형태를 한번 정도는 숙지할 필요는 있다.

 

이번 글에서는 엑셀의 특정열의 갯수를 세는 방법빈칸 없애는 방법에 대해 알아보자.

 


2. 사전설명

< 그림1 >의 E열에는 몇 개의 데이터가 있는가? 언뜻 보면 11개로 보일 것이다. 구분의 "시가" 1개와 "시가값"들 10개를 합산한 11개이다.

 

그런데, pc 도 11개로 인지할까? 14개는 아닐까? E열의 1~3줄은 비어있긴 하지만, 카운팅하지 않을까?

실제로 E열에 어떤 데이터가 있는지 구해보자. 아래 < 코드2 >에서 확인하였듯이 14개로 인지하는 걸 알 수 있다. 빈칸(E1 ~ E3)도 카운팅하고 있는 것이다.

import openpyxl

dir = r'C:\Users\User\Desktop\excel_test.xlsx'  # 경로 설정

wb = openpyxl.load_workbook(dir)    # 엑셀파일 열기
ws = wb.active                      # 현재 활성화된 시트 얻기 (마지막 저장된 시트)

########## 엑셀의 E열 개수 구하기 ###################
line_row = ws['E']          # 엑셀에서 받은 최초의 데이터는 "튜플"형이다.

print(len(line_row))
print(line_row)


### (expected result)
### 14
### (<Cell 'Sheet1'.E1>, <Cell 'Sheet1'.E2>, <Cell 'Sheet1'.E3>, <Cell 'Sheet1'.E4>, <Cell 'Sheet1'.E5>, <Cell 'Sheet1'.E6>, <Cell 'Sheet1'.E7>, <Cell 'Sheet1'.E8>, <Cell 'Sheet1'.E9>, <Cell 'Sheet1'.E10>, <Cell 'Sheet1'.E11>, <Cell 'Sheet1'.E12>, <Cell 'Sheet1'.E13>, <Cell 'Sheet1'.E14>)

코드2. PC는 E열(시가)을 14개(len)로 인지한다.

 


3. 코드설명

우리는 "시가의 값"들의 갯수를 알고 싶다. 어떻게 해야 할까? for 문을 돌려서 "시가의 값"이 없는 칸 및 "구분의 시가(4행)"을 E열의 데이터 카운팅에서 빼야 한다. 이 때 필요한게 R1C1의 셀주소 형태와 for문이다. 여기서부터는 살짝 어려울 수도 있으니, 나중에 천천히 읽어보시길 권한다.

 

line_row = ws['E']          # 엑셀에서 받은 최초의 데이터는 "튜플"형이다.

코드3. 활성화된 시트(ws)의 E열에서 받아온 데이터 형태는 튜플형이다.

 

E열(列, column)의 데이터를 받아오면, < 코드2 >의 17줄처럼 튜플형태로 데이터를 받아온다. for문으로 돌리기 위해 튜플형을 리스트 형태로 바꾸어준다. 바꾸는 방법은 < 코드4 >의 10줄에서 확인가능하며 튜플형 앞에 list를 붙이면 된다.

import openpyxl

dir = r'C:\Users\User\Desktop\excel_test.xlsx'  # 경로 설정

wb = openpyxl.load_workbook(dir)    # 엑셀파일 열기
ws = wb.active                      # 현재 활성화된 시트 얻기 (마지막 저장된 시트)

########## 엑셀의 E열 개수 구하기 ###################
line_row = ws['E']          # 엑셀에서 받은 최초의 데이터는 "튜플"형이다.
line_row = list(line_row)   # 리스트 형으로 변경 (리스트 내 항목 숫자를 세어보기 위함)

print(len(line_row))
print(line_row)


### (expected result)
### 14
### [<Cell 'Sheet1'.E1>, <Cell 'Sheet1'.E2>, <Cell 'Sheet1'.E3>, <Cell 'Sheet1'.E4>, <Cell 'Sheet1'.E5>, <Cell 'Sheet1'.E6>, <Cell 'Sheet1'.E7>, <Cell 'Sheet1'.E8>, <Cell 'Sheet1'.E9>, <Cell 'Sheet1'.E10>, <Cell 'Sheet1'.E11>, <Cell 'Sheet1'.E12>, <Cell 'Sheet1'.E13>, <Cell 'Sheet1'.E14>]

코드4. 튜플형을 리스트형으로 바꾸었다.

 

리스트형을 만들어주었으므로,  for문을 돌려서 빈칸(E1 ~ E3)을 제외시켜보자.

import openpyxl

dir = r'C:\Users\User\Desktop\excel_test.xlsx'  # 경로 설정

wb = openpyxl.load_workbook(dir)    # 엑셀파일 열기
ws = wb.active                      # 현재 활성화된 시트 얻기 (마지막 저장된 시트)

########## 엑셀의 E열 개수 구하기 ###################
line_row = ws['E']          # 엑셀에서 받은 최초의 데이터는 "튜플"형이다.
line_row = list(line_row)   # 리스트 형으로 변경 (리스트 내 항목 숫자를 세어보기 위함)

excel_long_short_list = []
for i in range(len(line_row)):
    if line_row[i].value != None:       # 엑셀의 빈칸은 파이참에서 None으로 출력 ("None"가 아니다. 따옴표를 붙이면 안된다)
        excel_long_short_list.append(line_row[i].value)

print(excel_long_short_list)


### (expected result)
### ['시가', 15185, 15185.75, 15186.5, 15186.5, 15186.25, 15186.5, 15186.5, 15186.5, 15186, 15187]

코드5. 엑셀의 빈칸을 파이참에서 없애는 방법이다

 

12줄 : 임의의 리스트(excel_long_short_list)를 선언한다.

13줄 : 10줄에서 선언한 리스트 갯수(14개)만큼 for문을 돌린다.

14줄 : 10줄의 리스트 자리수(0~13)에 해당하는 값이 None이 아니면 (= 빈칸이 아니면)

15줄 : 12줄의 리스트에 추가하라.

17줄 : 리스트를 출력하라.

 

여기서 주목할 것은 4행의 '시가'이다. '시가'를 어떻게 없애야 하는가?

import openpyxl

dir = r'C:\Users\User\Desktop\excel_test.xlsx'  # 경로 설정

wb = openpyxl.load_workbook(dir)    # 엑셀파일 열기
ws = wb.active                      # 현재 활성화된 시트 얻기 (마지막 저장된 시트)

########## 엑셀의 E열 개수 구하기 ###################
line_row = ws['E']          # 엑셀에서 받은 최초의 데이터는 "튜플"형이다.
line_row = list(line_row)   # 리스트 형으로 변경 (리스트 내 항목 숫자를 세어보기 위함)

excel_long_short_list = []
for i in range(len(line_row)):
    if line_row[i].value != None:       # 엑셀의 빈칸은 파이참에서 None으로 출력 ("None"가 아니다. 따옴표를 붙이면 안된다)
        excel_long_short_list.append(line_row[i].value)

print(excel_long_short_list)
excel_long_short_list.pop(0)       # '시가' 삭제 (pop 함수는 인덱스 삭제)
print(excel_long_short_list)


### (expected result) ###
### ['시가', 15185, 15185.75, 15186.5, 15186.5, 15186.25, 15186.5, 15186.5, 15186.5, 15186, 15187]
### [15185, 15185.75, 15186.5, 15186.5, 15186.25, 15186.5, 15186.5, 15186.5, 15186, 15187]

코드6. 구분에 해당하는 '시가'를 18줄 pop함수를 이용하여 삭제한다.

 

17줄 : '시가'를 삭제하기 전의 리스트이다.

18줄 : pop 함수는 리스트 내의 특정위치에 있는 항목을 삭제한다. 지금은 0자리에 해당하는 '시가'를 삭제한다.

19줄 : '시가'를 삭제한 후의 리스트이며, 순수하게 데이터만 들어가 있다.

 


4. 마치며

지금까지 엑셀의 데이터를 파이참으로 가져와서 출력하는 방법, 갯수 세기, 빈칸 없애기 등을 알아보았다. 다음글에서는 "엑셀에서 파이참으로 데이터 가져오기"의 마지막 시간으로 활용에 대해 알아보고자 한다.

 

 

반응형