Python 엑셀 파일이나 CSV로 내보낼 수 있는 pyexcel 라이브러리 알아보기
오늘은 Python으로 메모리상이나 물리적인 csv, 엑셀 파일로 저장할 수 있고, SQLAlchemy나 Django 모델로 이을 수 있는 pyexcel 패키지를 알아보려 합니다.
pyexcel 설치
우선 virtualenv로 파이썬 환경을 분리해줍니다.
pip3 install virtualenv
virtualenv -mvenv env
env라는 이름의 가상 환경을 생성합니다.
source env/bin/activate
가상환경을 폴더에서 활성화합니다.
pip3 install --upgrade pip
pip의 업그레이드가 존재하는지 확인하고 진행합니다.
pip install pyexcel
pip로 pyexcel을 설치합니다.
pip install pyexcel-text
pip install pyexcel-xls
터미널에 테이블 형식으로 출력하거나, 엑셀 파일을 조작할 때는 위와 같이 추가로 설치해야 합니다.
text
import pyexcel
pyexcel을 가져옵니다.
sheet = pyexcel.Sheet()
Sheet를 생성합니다.
sheet.name = "name"
sheet.ndjson = """
{"year": ["2017", "2018", "2019", "2020", "2021"]}
{"user": [129, 253, 304, 403, 545]}
{"visit": [203, 403, 632, 832, 1023]}
""".strip()
print(sheet)
값을 대입하고 출력하면 아래와 같이 테이블 형식의 데이터가 출력됩니다.
pyexcel sheet:
+-------+------+------+------+------+------+
| year | 2017 | 2018 | 2019 | 2020 | 2021 |
+-------+------+------+------+------+------+
| user | 129 | 253 | 304 | 403 | 545 |
+-------+------+------+------+------+------+
| visit | 203 | 403 | 632 | 832 | 1023 |
+-------+------+------+------+------+------+
위와 같이 출력되려면 pyexcel-text 패키지가 필요합니다.
excel
엑셀로도 내보내고 가져올 수 있습니다.
import pyexcel
pyexcel 패키지를 가져옵니다.
test_dict = [
{
"type": "PushEvent",
"created_at": "2019-01-01T07:58:30Z",
"id": "0000000001",
"public": True,
},
{
"type": "PushEvent",
"created_at": "2019-01-02T07:58:30Z",
"id": "0000000002",
"public": True,
},
{
"type": "PushEvent",
"created_at": "2019-01-03T07:58:30Z",
"id": "0000000003",
"public": True,
},
]
위 예시는 github event api의 json 코드를 많이 생략하고 가져왔습니다.
pyexcel.save_as(records=test_dict, dest_file_name="test.xls")
위 딕셔너리를 넣고 test.xls라는 엑셀파일을 내보냅니다.
records = pyexcel.iget_records(file_name="test.xls")
for record in records:
print(record['created_at'], record['id'])
test.xls라는 엑셀파일로부터 레코드 목록을 얻어서 created_at, id를 출력합니다.
database
데이터베이스에 연결해서 엑셀파일로 보낼 수 있습니다.
engine = create_engine("sqlite:///test.db")
Base = declarative_base()
Session = sessionmaker(bind=engine)
class test_entity(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True)
name = Column(String)
Base.metadata.create_all(engine)
데이터베이스의 엔진과 필드 엔티티를 정의합니다.
session = Session()
pyexcel.save_as(file_name="test.xls",
name_columns_by_row=0,
dest_session=session,
dest_table=test_entity)
엑셀의 값을 넣기 원하는 세션, 테이블 객체를 정의합니다.
sheet = pyexcel.get_sheet(session=session, table=test_entity)
print(sheet)
반대로 특정 데이터베이스 세션으로부터 시트를 가져올 수도 있습니다.
Written on June 20, 2019