pyscript를 사용하여 excel 데이터 읽기.
pyscript에 대해서
pyscript는 python을 웹 브라우저에서 구동하는 스택입니다.
아직 많이 확장되지 않아 사용에는 조금 불편함이 있을 수 있습니다.
파이썬의 장점인 많은 라이브러리를 이용하여 웹브라우저에서 사용한다면 괜찮은 스택이 될 수 있습니다.
pyscript를 검색하다보면 pyodide가 필수적으로 나오게 되는데 정보를 꼼꼼히 살펴보지 않는 분들이라면
두개가 필히 다른 종류라고 생각하실 수 있습니다.
pyscript는 pyodide를 기반으로 작동하는 script 이며 근간에는 javascript를 통하여 작동합니다.
pyscript의 장점
pyscript는 특이하게 javascript와 같이 사용됩니다.
이를 통해서 백엔드 코드가 필요없이 client의 브라우저에서 파이썬 코드의 역할을 수행할 수 있습니다.
또한 python의 많은 라이브러리를 이용하여 코드를 작성할 수 있습니다.
예시로 pandas , np등을 이용하여 데이터를 만질 수 있습니다.
사용자 정의 클래스도 사용이 가능합니다.
Python과 Javascript 개체 및 네임스페이스 간의 양방향 통신 가능
pyscript의 단점
pyscript는 아직 개발중인 스택입니다.
python에서는 사용가능한 라이브러리가 pyscript에서는 사용이 불가능할 수있습니다.
또한 javascript에 기반을 두고 있기 때문에 브라우저에서 로컬 파일을 다루는 것에 대해서 조금 부적절한 면이 존재합니다.
그리고 브라우저를 통하여 백엔드와 같은 역할을 수행하기 때문에 클라이언트의 컴퓨터 스펙에 속도의 여부가 결정됩니다.
또한 pyscript를 지원하는 브라우저에서만 작동합니다.
이번에 pyscript를 공부하면서 다루게 된 코드에 대해서 간략히 설명하려고 합니다.
pyscript는 html을 통하여 작동시킬 수 있습니다.
pyscript_code
아래의 코드는 html에서 input 박스를 통하여 excel 파일을 입력 받았을 때 pyscript에서 엑셀을 dataFrame으로 처리하기 위해 작성한 코드입니다.
<!DOCTYPE html>
<head>
</head>
<body>
<py-env> #외부 라이브러리를 불러오는 라인
- pandas #외부 라이브러리인 pandas를 사용하기위해 불러옴
#해당 라인을 통하여 사용하기위해서는 pyodide,pyscript 에서
#해당 라이브러리를 지원해야함
</py-env>
<py-script> #스크립트 작성라인
import pandas as pd
import asyncio
from io import BytesIO
from pandas import DataFrame
from js import document, FileReader, Uint8Array, Object, window
from pyodide import create_proxy, to_js
async def read_event_files(event) :
# 아래라인은 html 입력이벤트를 이용하여 파일을 입력받았을 때
# pyscript 에서 사용하기 위해 파이썬 형식으로 변환하는 코드
fileList = event.target.files.to_py()
for f in fileList:
text = f.text #읽어온 파일이 csv or txt 파일이라면 string데이터를 취득가능
# 읽어온 데이터가 xlsx파일 형식은 일반적으로 string 형식으로는 데이터를 취득할 수 없다.
# 또한 기본적으로 java_proxy라는 형태를 하고있기때문에 pd.read_excel을 바로 사용할 수 없다.
# 이를 해결하기 위해 아래의 코드를 이용하여 xlsx파일을 바이너리 형태로 가공하여 read_excel 처리를 할 수 있다.
data = Uint8Array.new(await f.arrayBuffer())
mf = io.BytesIO(bytearray(data))
df_list.append(mf)
def main():
# 파이썬 코드를 addEventListener에서 이용하기위해 create_proxy를 하여야함.
file_read_event = create_proxy(read_event_files)
e = document.getElementById("filepicker")
e.addEventListener("change", file_event, False)
</py-script>
</body>
</html>
PyScript 공식 페이지
Pyscript.net
Run Python code in your HTML.
pyscript.net
PyScript 예제 링크
- https://pyscript.net/examples/
PyScript demo
REPL2 A Python REPL (Read Eval Print Loop) with slightly better formatting
pyscript.net
Pyodide 공식 페이지