본문 바로가기
아래아한글 자동화/pyhwpx 사용법

[pyhwpx] hwp.put_field_text에 입력 가능한 6가지 자료구조☆☆☆☆☆

by 일코 2024. 2. 10.

파이썬의 창시자 Guido Van Rossum 선생님은 말씀하셨지.

Readability comes first,
performance next.

 

가독성보다는 성능에 치중해서, 비교적 복잡한 메서드를 사용하는 프로그래머들에게
"경미한 성능향상보다는 가독성을 중시해서 코딩하라"는 맥락으로
연산자 오버로딩의 장점에 대해 다루면서 하신 말씀이긴 했지만,

pyhwpx의 문법도 가급적 사용자 지향적으로,
성능보다는 가독성이나 편의 위주로 코드를 짜보고 있다.
약간 과하다 싶을만큼 추상화를 하기도 했고, "로우코드"스럽게 만들고 싶었다.
(그렇다고 성능을 엄청 버린 건 아니고.. 내부적으로는 최대한 빠른 방법을 썼다.)

그 중 최고로 유용하게 쓰일 메서드를 고르라면
단연 put_field_text를 꼽고 싶은데(그 다음은 table_to_df, table_from_data 순)
기존 win32의 hwp.PutFieldText를 업그레이드한 메서드다.

이번 포스팅에서는
hwp.put_field_text의 6가지 사용방법에 대해 적어둔다.

1. hwp.put_field_text(필드명, 값)

가장 기본적인 사용법이다.
필드 하나에 값 하나를 넣는 방법이다.

동일한 이름의 필드가 여러 개 있을 때에는
모든 (동일한 이름의) 필드에 값이 대입된다.

 

2. hwp.put_field_text(필드명, 리스트)

"이름"이라는 필드가 5개 있을 때, 길이가 5인 리스트를 값에 대입할 수 있다.

리스트의 길이가 5보다 작을 때는 작은대로, 크면 큰 대로,
넣을 수 있는 만큼만 들어간다.

적으면 적은대로
많으면? 들어가는만큼만

 

3. hwp.put_field_text(dict)

dict 삽입이 가능한데, key는 필드명과 같아야 하며, 해당 value 가 필드에 대입된다.

만약 dict의 value가 리스트나 튜플이라면 2번의 경우처럼 각각 매핑된다.

필드가 여러개, dict의 키도 여러 개라면,
각각의 필드에 맞게 매핑된다.

dict를 사용하면 필드삽입이 굉장히 간편해지는 반면, 주의할 점이 있는데!
value의 타입과 길이를 통일해야 한다. (전부 길이가 같은 리스트나 튜플)
예를 들어 아래와 같은 경우는 의도대로 동작하지 않을 수 있다.

[40] 대신 [40, 40, 40, 40, 40]으로 입력해야 한다.

 

4. [(키1, [값리스트]), (키2, [값리스트])] 형식 삽입가능

dict.items() 형태의 리스트 또는 튜플로 구성되어 있는 경우이다.
이 경우에도 0번요소를 키로, 1번요소를 값리스트로 자동매핑을 해준다.

이상 네 가지의 자료형이 아닌 경우에는
거의 모두 오류가 나거나, 이상하게 삽입이 되어버린다. 유의하자.
(근데 진짜 이 정도면 충분하지 않나?)

DB에서 select로 데이터를 추출해올 때 이런 형식이었던 적이었던 것 같기도 하다...

 

5. hwp.put_field_text(pd.DataFrame)

판다스데이터프레임의 칼럼명이 필드명과 동일하면
데이터프레임의 각 행이 필드에 삽입된다.

단, 필드명이 다르면 작업이 복잡해진다ㅜ

개인적으로는 가급적 데이터프레임을 사용하는 방식을 추천하는데,
가공도 편하고, 칼럼명을 바꾸는 작업도 다른 자료형에 비해 훨씬 쉽기 때문이다.

 

6. hwp.put_field_text(엑셀파일경로)  # 오예ㅔㅔㅔㅔ!!!!!

엑셀파일이나 csv파일의 절대/상대경로를 직접 입력하면,
내부적으로 해당파일을 열어서 값을 매핑한다.

엑셀파일의 칼럼만 한/글 문서 필드명과 맞춰놓으면
그 수십줄의 매핑 코드를 한 줄로 줄일 수 있게 되었다.

다만, 특정 필드, 예를 들면
날짜 필드를 yyyy-mm-dd 방식으로 변환해야 한다든지,
문자열 일부에 replace나 split 등의 가공을 해야 하는 경우는

1. 엑셀파일을 통해 필드에 삽입한 후, 한/글에서 직접 일괄 수정하거나.

2. 엑셀을 직접 넣지 말고 데이터프레임으로 가져와서 df를 수정한 후, 필드에 넣거나.

둘 중 한 가지 방법을 골라서 작업하면 된다.

 

마치며, 주의할 점은

사실 put_field_text 메서드를 짜면서 고민을 제법 많이 했다.
(필자가 pyhwpx를 만든 가장 큰 계기이기도 하다.)
직접 업무자동화 코드를 짜거나 기관 자동화 코드를 짜주면서
혹은 문의메일을 받으면서 
나름대로 패턴을 정리해보고 메서드를 짰는데
"로우코드"라고 부르자니, 아직 갈 길이 멀어 보인다.

위 방식이 아닌 다른 모든 방식,
예를 들어 hwp.put_field_text([필드리스트], [[값1리스트], [값2리스트],...]) 라든지,
이런 상상만 해봄직한 괴상한 데이터는 처리해주지 않는다. (raise 하기도 애매해서, 이상하게 삽입되게 뒀다ㅜ)
꼭 위의 여섯 가지 패턴 중 하나에 맞춰서 삽입하자! (진짜 이 정도면 충분하지 않을까?)


혹시 이밖에 삽입했으면 하는 자료구조가 있다면
댓글로 건의 주시기 바람!

댓글