인프런 커뮤니티 질문&답변

sunstephan님의 프로필 이미지
sunstephan

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

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

엑셀문서의 데이터를 필드에 입력하기 파트에서 문의사항 있습니다.

해결된 질문

작성

·

309

1

for row in range(2,8): data = list( ws.Range(ws.Cells(row,1),ws.Cells(row,4)).Value[0] ) data[2] = data[2].strftime("%Y. %#m. %#d.") print(data)

에서

ws.Range(ws.Cells(row,1),ws.Cells(row,4)).Value[0] 마지막에 value[0]은 왜 넣는 거죠?

이미 영역을 지정해서 리스트 자료형으로 작성하면 되는데 value[0]을 넣는 이유가 궁금합니다.

value[1]로 수정해 보니 tuple index out of range 라고 뜨네요..

답변 1

1

일코님의 프로필 이미지
일코
지식공유자

sunstephan님 안녕하세요?^^

for row in range(2,8): 
    data = list(ws.Range(ws.Cells(row,1),ws.Cells(row,4)).Value[0]) 
    data[2] = data[2].strftime("%Y. %#m. %#d.") 
    print(data)

언급해주신 부분은 ws.Range가 리턴하는 shape 때문입니다.

ws.Range().Value 가 리턴하는 값은 항상 이중튜플입니다.

예를 들어, 아래와 같은 범위(한 행)를 가져오는 경우에도

image(이미지 우클릭 후 "새 탭에서 이미지 열기"를 선택하시면 이미지를 크게 보실 수 있습니다.)

 

리턴된 값을 자세히 보시면

(
    (1.0, 2.0, 3.0, 4.0, 5.0),
)

2중 튜플 안에 딱 한 개의 튜플(행)이 5개의 요소(열)를 가지고 있는 구조입니다.
위와 같이 한 행이 한 튜플 안에 들어있게 됩니다.

 

아래와 같은 경우에도

image

경미한 차이가 있지만 역시 튜플데이터들이 또 다른 튜플 안에 들어 있는 구조입니다.
리턴된 튜플을 다시 펼쳐 써보면,

(
    (1.0),
    (2.0),
    (3.0),
    (4.0),
    (5.0),
)

2중튜플 안에 다섯 개의 튜플(행)이 들어있는 구조죠?^^

 

워크시트 범위에서 Range메서드를 통해 가져오는 튜플은
어떤 경우든지 한 행(row)이 한 개의 튜플을 리턴하고,
해당 튜플 모음은 한 개의 튜플로 감싸져 있는 이중튜플입니다.

다섯 개의 행을 가져왔기 때문에 바깥 튜플 안에 다섯 개의 튜플이 들어있습니다.

 

그래서 Vaue[0]을 써야 하는데, 만약 [0]을 붙이지 않은 .Value라고만 코드를 써버리면

리스트 안에 튜플이 들어있는 구조가 되어버릴 겁니다. 수정을 할 수가 없죠.

 

아래 예시의 마지막 라인과 리턴되는 값을 참고하시면 쉽게 이해하실 수 있을 겁니다^^
우리가 원하는 구조가 (수정이 가능한) 가장 마지막 라인의 리턴이니까요.

image

도움이 되었길 바랍니다^^

행복한 하루 되세요!!!

sunstephan님의 프로필 이미지
sunstephan

작성한 질문수

질문하기