해결된 질문
작성
·
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 가 리턴하는 값은 항상 이중튜플입니다.
예를 들어, 아래와 같은 범위(한 행)를 가져오는 경우에도
(이미지 우클릭 후 "새 탭에서 이미지 열기"를 선택하시면 이미지를 크게 보실 수 있습니다.)
리턴된 값을 자세히 보시면
(
(1.0, 2.0, 3.0, 4.0, 5.0),
)
2중 튜플 안에 딱 한 개의 튜플(행)이 5개의 요소(열)를 가지고 있는 구조입니다.
위와 같이 한 행이 한 튜플 안에 들어있게 됩니다.
아래와 같은 경우에도
경미한 차이가 있지만 역시 튜플데이터들이 또 다른 튜플 안에 들어 있는 구조입니다.
리턴된 튜플을 다시 펼쳐 써보면,
(
(1.0),
(2.0),
(3.0),
(4.0),
(5.0),
)
2중튜플 안에 다섯 개의 튜플(행)이 들어있는 구조죠?^^
워크시트 범위에서 Range메서드를 통해 가져오는 튜플은
어떤 경우든지 한 행(row)이 한 개의 튜플을 리턴하고,
해당 튜플 모음은 한 개의 튜플로 감싸져 있는 이중튜플입니다.
다섯 개의 행을 가져왔기 때문에 바깥 튜플 안에 다섯 개의 튜플이 들어있습니다.
그래서 Vaue[0]을 써야 하는데, 만약 [0]을 붙이지 않은 .Value라고만 코드를 써버리면
리스트 안에 튜플이 들어있는 구조가 되어버릴 겁니다. 수정을 할 수가 없죠.
아래 예시의 마지막 라인과 리턴되는 값을 참고하시면 쉽게 이해하실 수 있을 겁니다^^
우리가 원하는 구조가 (수정이 가능한) 가장 마지막 라인의 리턴이니까요.
도움이 되었길 바랍니다^^
행복한 하루 되세요!!!