데이터를 가져와 가공하기
파이썬은 다양한 외부 파일들을 가져와 내용을 읽거나 쓰기가 가능합니다. 우리가 크롤링, 스크래핑이라고 하는 것은 HTML 문서를 읽는 것이라고 하지만 TXT 파일이나 EXCEL 파일들 내용을 가져오는 것 또한 크롤링이라고 말합니다.
파이썬은 대량 데이터를 모으고 분석하기 유용한 툴입니다. 엑셀과 아주 궁합이 잘 맞는다고 할 수 있습니다. 엑셀 자료로 만들어진 데이터들을 파이썬으로 불러와서 계산하고 분석하는 일은 실제로도 많이 활용되고 있습니다.
이번 글에서 파이썬을 이용해 엑셀파일 읽는 방법을 한번 다뤄보겠습니다.
엑셀파일은 행과 열로 이루어진 셀(cell)로 이루어진 문서입니다. 2차원 배열과 같다고 할 수 있습니다. 파이썬에도 2차원 배열로 데이터를 불러오는 라이브러리가 있습니다. 바로 판다스(pandas)입니다. 판다스를 이용하면 엑셀 형태의 데이터를 쉽게 불러오고 가공할 수 있습니다. 엑셀 뿐 아니라 웹문서의 표(table)도 쉽게 가져올 수 있습니다.
아래와 같은 엑셀 문서를 한번 파이썬으로 불러오고 이 값들을 이용해 다른 형태로 가공하는 연습을 해보겠습니다. 아래 엑셀 문서는 티스토리 포스팅 제목과 url을 최신순으로 정리한 것으로 이 파일 역시 파이썬으로 만들었습니다. 파이썬을 이용해 티스토리를 크롤링하여 제목과 url을 엑셀로 저장한 것입니다. 제가 서비스하는 티스토리 백업 서비스(크몽)의 일환입니다.
이 엑셀파일 데이터를 읽어올려면 pandas를 이용합니다. 필요한 라이브러리는 다음과 같습니다.
pandas
openpyxl
xlrd
먼저 이 세개의 라이브러리를 pip를 이용해 추가해주세요.(ex. pip install pandas)
설치가 완료되면 아래와 같이 코드를 적어봅니다.
import pandas as pd
filename ="tistory.xlsx" ##불러오고자 하는 엑셀파일의 경로를 적는다.
df = pd.read_excel(filename, engine='openpyxl')
pandas as pd 는 pandas라는 모듈을 pd라고 이름지어서 쓰겠다는 의미입니다. pandas의 내부 함수 중 read_excel이 엑셀파일을 읽어서 Dataframe 구조로 만들어주는 기능을 합니다. 이렇게 코드를 적고 df를 출력해 보겠습니다.
위와 같이 코드를 쓰면 아래와 같은 결과가 나옵니다.
흡사 엑셀 셀과 같은 배열이 나옵니다. 중간에 ... 은 생략된 것입다. 이 생략된 내용을 다 출력해서 보고 싶다면,
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
이 코드를 추가하면 됩니다.
pandas로 만들어진 dataframe은 아래와 같은 구조입니다.
엑셀에 있는 내용이 column과 row를 형성하면서 2차원 배열로 만들어집니다. 맨 왼쪽의 0~4까지의 숫자는 엑셀에 없는 내용으로 row 개수에 따라 만들어지는 index입니다.
이 데이터프레임(dataframe)의 데이터를 이용해 a 태그를 만들어보겠습니다.
HTML에서 a 태그(앵커)는 하이퍼링크를 형성해 주는 것으로 다음과 같은 구조로 되어 있습니다.
<a href="https://naver.com" target="_blank">네이버 바로가기</a>
a 태그에는 href 속성과 target 속성을 가집니다. href 속성에는 클릭시 이동할 URL이 속성값으로 들어갑니다. target 속성은 링크를 오픈할 때 어디로 오픈할지를 알려주는 역할을 합니다. target 속성은 다음과 같은 값을 가질 수 있습니다.
_blank : 링크된 문서를 새로운 윈도우나 탭(tab)에서 오픈함.
_self : 기본값. 링크된 문서를 링크가 위치한 현재 프레임에서 오픈함.
_parent : 링크된 문서를 현재 프레임의 부모 프레임에서 오픈함.
_top : 링크된 문서를 현재 윈도우 전체에서 오픈함.
(출처 : http://www.tcpschool.com/html-tag-attrs/a-target)
새탭으로 열기 위해서는 target 속성에 _blank를 써줘야 합니다.
아까 파이썬으로 불러온 엑셀 파일에는 글 제목과 글 url 이 있으므로 글 제목을 앵커텍스트로 가지는 링크를 만들어 볼 수 있습니다.
(ex. <a href="https://frientor.tistory.com/2" target="_blank">내집 마련을 위한 장기 계획이 필요할 때</a>)
dataframe은 column값만 따로 가져올 수 있습니다. 엑셀 파일 중 '제목' 부분만 가져오고 싶다면 딕셔너리처럼 불러오면 됩니다. df['제목'], df['URL'] 이런식으로 각 column만 떼어낼 수 있습니다.(이것을 series라고 합니다.)
우리가 사용하려는 제목과 URL을 별도의 변수에 담아 봅니다.
title = df['제목']
link = df['URL']
제목열에 해당되는 것을 1차원 배열인 series로 만들어 title 변수에 담은 것입니다. 각 값은 title[0], title[1] 이렇게 리스트(list)를 다루듯해서 값을 빼올 수 있습니다. 전체 리스트 개수는 index 값과 동일할 것이므로 for 문으로 index 값을 차례로 넣어서 title, link 값을 하나씩 빼올 수 있습니다.
for i in df.index:
print(title[i], link[i])
여기까지 실행해보면,
이렇게 제목과 링크만을 차례로 가져올 수 있습니다. 이를 변형하여 a 태그 형태로 만듭니다. url은 href 속성값으로 넣고 글 제목은 앵커텍스트로 넣습니다. 마지막 print(title[i], link[i]) 값을 다음과 같이 만듭니다.
print(f'<a href="{link[i]}" target="_blank">{title[i]}</a>')
출력값은 아래와 같습니다.
전체 코드는 아래 링크에서 확인 가능합니다.