본문 바로가기
IT

파이썬 - 엑셀의 내용을 출력해 봅시다

by 소혜민 2025. 1. 30.
반응형

앞서 엑셀을 만드는 것을 보았으니 이제는 엑셀 파일을 읽어봅시다. 앞서 만든 간단한 정보가 아니라 뭔가 많은 정보를 담고 있는 엑셀을 출력해 보는 것이 나중에 어떤 업무에 적용을 하던 도움이 될 것 같습니다. 엑셀을 읽을 때도 똑같은 패키지 openpyxl을 사용할 예정입니다. 그러면 어떤 자료를 출력해 볼까요? 강의를 준비하면서 웹서핑을 해서 찾은 정보를 공유하겠습니다. 

 

https://www.kftc.or.kr/mobile/data/MobileBankinqByCode.do#none

 

금융결제원에서 다운로드 받은 codefilex.xls로 전국 은행코드 및 은행이름과 주소를 담고 있는 파일입니다. 해외 지사의 정보까지 있어 총 자료의 개수가 무려 28,682개 입니다. 위의 웹 페이지에서 제일 좌측에 있는 파일입니다. 웹이라 언제 어떻게 바뀔지 모르기 때문에 이 책을 보고 계실 때는 웹페이지가 없거나 파일이 바뀌어 있을 수도 있겠습니다. 그래서 나중에 본 책에서 쓴 모든 소스 파일과 자료 파일을 모두 공유하도록 하겠습니다. 파일은 codefilex.xlsx로 저장해서 프로젝트 폴더에 files라는 폴더를 만들고 그 안에 넣어 두었습니다. 최신 엑셀 파일 형식은 xlsx이니 미리 바꿔 저장해 둔 것입니다.  

 

 

엑셀 파일을 만들 때, 우리가 썼던 두 가지 방법을 기억해 보겠습니다. A1, B1과 같은 방식이 있었죠. A1과 B1의 정보는 각각 ‘은행코드’와 ‘은행명’입니다. 그리고 또 다른 방법은 cell() 이라는 함수를 썼었죠. cell() 함수에서 1,3 그리고 1,4로 표현을 하면 ‘점포명’과 ‘전화번호’가 되겠습니다. 

 

003_readExcel.py

003.readExcel.py

 

엑셀 파일을 읽는 코드는 간단합니다. 엑셀 파일을 열고 codefliex라는 워크시트를 선택합니다. 그리고 “A1”과 Cell(1, 2)를 읽어서 터미널 창에 출력을 하고 있습니다. 

 

 wb = openpyxl.load_workbook(r".\files\codefilex.xlsx")

 

openpyxl에서 엑셀을 생성할 때는 Workbook() 함수를 사용했었는데 읽어올 때는 load_workbook() 이라는 함수에 엑셀 파일의 경로를 써서 읽어옵니다. load_workbook() 함수 안에 파일의 위치는 r”.\files\codefilex.xlsx”와 같이 표현이 되어 있습니다. 여기서 세 가지 규칙을 알고 가시면 되겠습니다. 우리가 코딩하는 003.readExcel.py와 같은 폴더에 엑셀 파일이 있다면 “codefilex.xlsx”와 같이 표현을 하면 됩니다. 그런데 003.readExcel.py와 같은 폴더에 files라는 폴더를 만들었고 그 안에 codefilex.xlsx파일이 들어 있습니다. 그래서 ‘.’은 현재의 폴더를 얘기하고, 현재의 폴더 안에 files라는 폴더가 존재하고 그 안에 codefilex.xlsx가 있어서 “.\files\codefilex.xlsx”가 됩니다. 그런데 따옴표 앞에 ‘r’이 붙어 있습니다. r은 raw string 즉, 따옴표 안에 있는 글자를 그대로 봐 달라는 의미입니다. 왜 이렇게 해야 할까요? 그 이유는 바로 역슬래시(\) 때문입니다. 컴퓨터에서 역슬래시는 그 다음에 나오는 문자와 결합되어 특수한 의미를 가지기 때문입니다. 그래서 역슬래시(\)가 나오더라도 특수한 의미로 사용하지 말라는 의미입니다. 예를 들어 \n은 컴퓨터에서 터미널에 출력을 할 때, 줄을 바꿔 출력을 하라는 의미입니다. 예를 들어 print(“우리는 줄바꿈\n을 배웠습니다”)를 실행해 본다면 첫번째 줄에는 “우리는 줄바꿈” 두번째 줄에는 “을 배웠습니다”로 출력이 됩니다. 

 

 ws = wb['codefilex']

 

엑셀, 워크북에서 존재하는 워크시트를 선택하는 방법입니다. 대괄호 안에([ ]) 워크시트 이름을 넣으면 됩니다. 

 

 print(ws['A1'].value, ws.cell(1, 2).value)

 

마지막은 엑셀 파일의 일부를 출력해 보는 방법입니다. print() 함수의 앞쪽은 우리가 이해하기 쉬운 전통적인 방법이고, 두 번째는 컴퓨터가 이해하기 쉬운 방법이라고 말씀드렸습니다. 

아주 간단한 예제를 보여드렸는데요. 생각보다 print() 함수가 실행될 때까지 많은 시간이 걸린다고 느끼지 않았나요? 아무래도 엑셀 파일에 자료가 많다보니 엑셀을 여는데 시간이 많이 걸려서 그렇습니다. 그리고 두가지 방법 모두 뒤에 .value가 붙어 있습니다. 왜냐하면 엑셀의 각각의 셀을 생각해 보면 색상도 넣을 수 있고, 테두리도 넣을 수 있는 등 여러가지 속성을 넣을 수 있기 때문에 그 중에 하나의 속성인 value를 이용해서 값을 가지고 와야 하는 것입니다. 

 

자~ 이젠 엑셀 파일의 모든 내용을 출력해 보도록 하겠습니다. 앞서 사용한 두 가지 방법을 모두 사용을 하게 될 예정입니다. 여기선 for라는 반복문을 배울 것이고, 전체 자료가 몇개의 행과 몇개의 열로 이루어져 있는지를 확인 하는 방법을 알아보겠습니다.

 

먼저 우리가 이해하기 편한 방법부터 살펴보도록 하겠습니다. 

먼저 엑셀파일을 보면 A ~ H 열까지 총 9개의 열로 구성이 되어 있고, 행의 수는 제목을 포함해서 28683개로 이루어져 있네요. 




004_readExcel2.py

004.readExcel2.py

 

 mc = ws.max_column

 mr = ws.max_row

 

6 ~ 7 라인은 max_column과 max_row라는 워크시트의 변수, 보통 클래스 안에 들어있는 변수를 멤버 변수라고 부르는데요. 클래스의 멤버라서 그렇게 부르는가 봅니다. 이 멤버 변수들은 각각 워크시트의 최대 행과 최대 열을 갖고 있습니다. 

 

 for i in range(1, mr+1, 1):

 

for 반복문 입니다. for 다음에 있는 것은 변수입니다. 변수는 계속 변하는 것이고, range로 표현되는 범위에서 변하게 됩니다. 그래서 앞의 반복문은 i가 계속 변하는데요. i가 괄호의 첫 변수 부터 시작을 해서 세 번째 변수 만큼 증가하면서 두 번째 변수보다 작을 때까지 계속 반복이 됩니다. 앞서서 mr 그러니까 워크시트의 최대 행이 28683 행이고 거기에 1을 더해 줬으니까 1에서 시작해서 1씩 증가하면서 28683까지 반복을 하라는 의미입니다.  

그럼 10개만 출력하려면 어떻게 하면 될까요? range를 range(1, 11, 1)와 같이 변경하면 됩니다. 1에서 시작해서 10까지 1씩 증가하면서죠. 그럼 1부터 시작해서 홀수로 간다면요? 그렇습니다. 맨 마지막의 1을 2로 변경하면 1, 3, 5와 같이 i가 바뀌면서 반복을 하게 될 것입니다.

 for i in range(1, mr+1, 1):

print(i, ws[f'A{i}'].value, ws[f"B{i}"].value

       ws[f"C{i}"].value, ws[f"D{i}"].value,

            ws[f"E{i}"].value, ws[f"F{i}"].value

            ws[f"G{i}"].value, ws[f"H{i}"].value)

 

for문은 맨 뒤에 ‘:’으로 끝이 납니다. 그리고 반복되는 부분은 for문 보다 들여다 쓴 문장들을 순서대로 반복을 하게 되는 것입니다. 즉, for문은 range 내에서 반복하면서 계속 print를 진행하게 되는 것입니다. 그리고 print 문이 길기 때문에 ‘,’ 다음에 줄을 바꿀 수 있습니다. 줄이 바뀐 print문은 앞에 보여지는 바와 같이 print보다 들여서 쓰는 것이 보기에 좋습니다. print와 같은 라인이거나 for문과 같은 라인이어도 상관은 없습니다만 위와 같이 들여서 쓰는 것이 읽기에 좋습니다. f’A{i}’ 또는 f”B{i}”만 이해하면 어떤 의미인지는 이해할 수 있을 것 같습니다. f는 format 출력을 위해 따옴표 앞에 붙이는 것이고 따옴표 사이에 중괄호를 넣고, 그 안에 변수를 넣으면 해당되는 변수가 출력되는 것입니다. 결국 f’A{i}’는 i가 변경됨에 따라서 ‘A1’부터 ‘A28683’까지 바뀌면서 내용을 출력하게 되는 것입니다. 

 

똑같은 출력이지만 다른 방식을 배워 보도록 하겠습니다. 막상 더 편리하게 사용할 것 같은데 코딩을 해 놓고 보니 조금 복잡해 보이네요. 한번 보도록 합시다. 

 

005_readExcel3.py

005.readExcel3.py

 

모든 코드는 그대로인데 for 문 안이 바뀌었고, 줄 수는 늘어났지만 조금은 간단해 보이기도 합니다. 보는 사람의 입장에 따라 다르겠죠? 저는 아래쪽이 조금 더 읽기 쉽고 편합니다. 한 번 살펴보도록 합시다.

 

 for i in range(1, mr+1, 1):

print(i, end=' ')

for j in range(1, mc + 1, 1):

    print(ws.cell(i, j).value, end=' ')

print('')

 

총 다섯줄입니다. 맨 처음 나오는 for문은 row 그러니까 1행에서 마지막까지 행을 반복합니다.  그리고 세번 째 줄에도 for문이 있죠. 이 for문은 A에서 H열까지에 대응되는 1 ~ 9까지를 반복합니다. 첫번 째 줄에서 A ~ H 열까지를 반복하고, 두 번째 줄에서 A ~ H 열까지 반복하는 두 개의 for문이 있는 겁니다. 

첫번 째 for문은 들여쓴 두 번째에서 다섯 번째 줄까지 반복을 합니다. 그리고 세번 째 줄은 for문은 네번 째 줄을 반복하죠. 1, 2, 3, 4 (1 ~ 9), 5번 라인이 계속 반복된다고 보시면 되겠습니다. 그 다음은 네번 째 줄의 ws.cell(i, j).value를 봅시다. 우리에게 익숙한 ‘A1’과 같은 방식은 열과 행의 순서이지만 cell()함수는 행, 열의 순서입니다. 그리고 뒤에 붙은 ‘.value’는 엑셀의 각각의 셀이 가지고 있는 속성 중에서 셀의 값을 가지고 있습니다.  

 

 print() 함수는 세 줄이 있습니다. 두번 째, 네번 째, 다섯번 째 줄이죠.

 

    print(i, end=' ')

 

두번째 줄의 print문은 i를 출력합니다. 앞서 살펴봤던 print() 함수를 기억해 보시면 우리가 시킨 내용을 프린트하고 줄을 넘겼습니다. 그래서 다음의 print() 함수가 다음 줄에서 정보를 출력하게 되는 것이었습니다. 

그런데 상황에 따라서는 줄을 바꾸지 않고 뒤에 이어서 출력하고 싶은 경우가 있을 것입니다. 그런 경우에 end=’ ‘를 추가해 줍니다. 줄바꿈 대신에 ‘ ‘로 대체를 하라는 것입니다. 

 

        print(ws.cell(i, j).value, end=' ')

 

앞 선 print() 함수에서 i에 해당하는 숫자를 출력하고 줄바꿈 대신에 공백을 출력했습니다. 다음의 for 문 안에 있는 print() 함수에서는 cell의 정보를 출력하고 있죠. cell() 함수 내에서 i, 즉 행은 고정이 되고 j, 열만 변경되면서 해당 셀의 정보를 출력하고 뒤에 공백을 더합니다. 

 

    print('')

 

마지막 print() 함수는 공백을 출력하고 줄바꿈을 합니다. 

 

지금까지 똑같은 내용을 출력하는 두 가지의 방법을 살펴봤습니다. for문의 개수와 사용된 print() 함수의 개수가 다릅니다. 어떤 것이 더 좋다는 정답은 없습니다. 손에 익고 눈으로 보기에 편리한 방법을 택하면 됩니다. 



반응형

'IT' 카테고리의 다른 글

파이썬 - GUI를 가진 프로그램 - PySide6  (0) 2025.01.30
파이썬 - 파워포인트는 어떻게 만들까요?  (0) 2025.01.30
자가 출판 부크크  (1) 2025.01.21
아마존 자가 출판  (0) 2025.01.21
갑님을 이기기는 어려워  (1) 2024.12.11

댓글