🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    업무 자동화

  • 해결 여부

    해결됨

join(val) 코드 해석

24.03.09 17:34 작성 조회수 108

2

챕터명: [응용] 엑셀문서 값을 필드에 입력하기

# 셀범위 값 전부 읽어오기
xlsx_values = [list(i) for i in ws.UsedRange()]

# 날짜 문자열 수정하기
for idx, val in enumerate(xlsx_values):
    if idx:  # [0]은 제목이므로 생일 수정안함
        xlsx_values[idx][2] = xlsx_values[idx][2].strftime("%Y년 %#m월 %#d일")

print(xlsx_values)
# >>> [['이름', '성별', '생일', '취미'],
# ...  ['마크', '남', '1984년 5월 14일', 'VR'],
# ...  ['빌', '남', '1955년 10월 28일', '기부'],
# ...  ['일론', '남', '1971년 6월 28일', '트위터'],
# ...  ['제프', '남', '1964년 1월 12일', '독서'],
# ...  ['리사', '여', '1969년 11월 7일', '게임'],
# ...  ['슬아', '여', '1983년 6월 16일', '쇼핑']]

# 1페이지 복사해 둠
hwp.Run("CopyPage")

for idx, val in enumerate(xlsx_values[1:]):
    if idx:  # idx가 0인 경우는 제외
        hwp.Run("PastePage")  # 페이지 붙여넣기
    hwp.PutFieldText(f"이름{{{{{idx}}}}}\x02성별{{{{{idx}}}}}\x02생일{{{{{idx}}}}}\x02취미{{{{{idx}}}}}", 
                     "\x02".join(val))  # 4개의 값을 한 번에 배치삽입하는 방법. "\x02"로 구분함.

위 코드에서

hwp.PutFieldText(f"이름{{{{{idx}}}}}\x02성별{{{{{idx}}}}}\x02생일{{{{{idx}}}}}\x02취미{{{{{idx}}}}}",

"\x02".join(val))

이 부분이 이해가 잘 안됩니다.

 

  1. hwp.PutFieldText("이름", "홍길동") 이게 기본 형태로 알고 있는데, 저건 어떤 형태인가요?? 해석이 안되네요

idx가 1인 경우에 대입하면, hwp.PutFieldText("이름{{1}} 성명{{1}} 생일{{1}} 취미{{1}}") 이렇게 있는데, 이름{{1}} 뒤에 1을 더하는 식으로 각 필드명에 적용한다는 건가요??

 

  1. 그리고 마지막 join(val)은 무슨 역할인가요???

 

 

답변 2

·

답변을 작성해보세요.

1

형주님, 안녕하세요?

예제에서 보여드린 방식은

대량의 텍스트 데이터를 여러 필드에 한 번에 넣고 싶을 때,

최고로 빠른 고급 방식입니다.

(pyhwpx의 hwp.put_field_text도 내부적으로는 이 방식을 대부분 활용하고 있습니다.)

 

코드가 조금 복잡해 보이지만

간단히 말씀드리면 결국 "한 개의 문자열로 병합해서 한 번에" 입력하는 방식인데요.

 

차근차근 알려드리겠습니다.

  1. 가장 low하게 필드에 텍스트를 넣는 방법부터.

이름필드 = "name"
이름 = "형주"
나이필드 = "age"
나이 = 25
hwp.PutFieldText(이름필드, 이름)
hwp.PutFieldText(나이필드, 나이)

위 코드를 실행하면 "name"이라는 필드가 "형주"라는 문자열로 채워지는데요. (알고 계시죠?)

근데 이걸 한 번에 입력하는 방법이 있습니다.

아래처럼 실행하시면 됩니다.

필드 = "name\x02age"
텍스트 = "형주\x0225"
hwp.PutFieldText(필드, 텍스트)

자세히 보시면 "\x02"라는 문자열로 구분지어져 있는데요.

이렇게 병합해서 한 번에 입력하는 방식이 hwp.PutFieldText를 여러 번 실행하는 방식보다 훨씬 빠릅니다.

 

근데 동일명의 필드가 여러 개인 경우!!! (질문 주신 예제에서처럼요)

n번째 필드에만 특정 텍스트를 넣고 싶을 때에는

필드이름 뒤에다 "{{n}}"이라는 인덱스문자열을 꼭 추가하셔야 합니다.

("{{n}}"이 없는 경우에는 모든 필드에 동일한 값이 들어가버리게 됩니다.)

 

{{n}}에 대한 궁금증은 해결되었기를 바랍니다.

 

  1. 문자열 메서드 join의 용도와 사용법

join은 제가 파이썬에서 가장 많이 사용하는 문자열 메서드 중 하나인데요.

리스트나 튜플의 값들을 하나의 문자열로 병합하는 기능을 합니다.

아래와 같이 사용합니다.

>>> fields = ["이름", "나이", "성별"]
>>> fields_str = "+++".join(fields)
>>> fields_str
"이름+++나이+++성별"

>>> "\x02".join(fields)
"이름\x02나이\x02성별"

 

이런 병합과정을 거치면

hwp.PutFieldText(필드명, 텍스트)

라고 한 줄만 입력해도 여러 필드를 한 번에 채울 수 있는 거죠.

 

그리고 만약 pyhwpx를 사용하신다면

위와 같은 복잡한 과정 없이

from pyhwpx import Hwp

hwp = Hwp()
hwp.open(파일명)
hwp.put_field_text(엑셀파일명)

이렇게 실행하실 수도 있습니다. (단, 필드명과 엑셀의 칼럼명이 동일한 값들만 대입됩니다.)

image

 

표나 필드가 아예 준비되어 있지 않은 경우라도

hwp.table_from_data라는 메서드를 사용하시면

표가 자동생성됩니다.

image

도움이 되었길 바랍니다.

추가로 궁금한 부분이나, 구체적인 질문은

댓글이나 새질문으로 남겨주세요^^

 

행복한 하루 되세요!!!

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.09

안녕하세요, 인프런 AI 인턴입니다.

이형주님의 질문에 대한 답변을 찾기 위해 고민하였으나, 구체적으로 이와 동일한 상황을 다룬 내용을 찾는데 어려움이 있었습니다. 그러나 제공된 자료 중 아래의 내용이 이형주님의 질문과 연관이 있을 것 같아 추천해 드립니다.

“PutFieldText 함수 사용 관련 질문”에서 다루는 내용은 필드에 값을 넣는 방법에 대한 질문이며, Python과 아래아한글 자동화와 관련된 세부적인 구현 방법에 대한 답변을 제공하고 있습니다. 이 답변은 필드 삽입 방법에 대한 궁금증을 해결하는 데 도움이 될 수 있습니다.

이 답변에서 강사님이 제공한 코드 해설은 Python의 문자열 포매팅과 관련한 내용이 주를 이루며, f-string 포맷팅 방식을 사용해 특정 필드에 접근하는 방법과 필드의 중복을 허용하는 인덱스 사용 방법에 대해 설명하고 있습니다.

다만, 질문에서 언급하신 join(val)은 위 링크에서 직접적으로 다루지 않고 있습니다. join(val) 메서드는 Python에서 문자열 리스트를 하나의 문자열로 병합할 때 사용되며, "\x02".join(val) 구문은 val이라는 리스트의 각 요소를 \x02 문자열로 구분하여 하나의 문자열로 만드는 방법을 보여줍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

채널톡 아이콘