3. 비트코인 선물/3-4. 오류 해결

(파이썬) TypeError: list indices must be integers or slices, not str 오류 해결

봄이오네 2022. 10. 23. 08:08
반응형
목 차
1. 들어가며
2. 에러발생 원인
3. 해결 방법
4. 마치며

1. 들어가며

바이비트 API를 통해 주문을 넣고 취소를 하는 과정에서
아래와 같은 오류메시지가 나왔다.

TypeError: list indices must be integers or slices, not str

타입에러 : 리스트 인덱스는 정수나 슬라이스 형, 문자형이 아님
→ 리스트형을 문자형으로 추출할 때 발생하는 오류이다.
(리스트는 정수/슬라이스 형으로 추출해야 함)


2. 에러발생 원인

1) 데이터 확인

바이비트 서버에서 받아온 데이터는 리스트형과 딕셔너리형으로 섞여 있다.

{'data': [{'user_id': 0000000, 'symbol': 'BTCUSD', 'side': 'Sell', 'order_type': 'Limit', 'price': '21000', 'qty': '1 ......} ] }

{ [ { } ] } 형태이다.
→ 대분류(가장 바깥쪽)는 딕셔너리 형태이며,
중분류는 리스트, 소분류(가장 안쪽)은 딕셔너리 형태이다.
* 'user_id'는 고유번호로서, 바이비트에서 받아오는 정보이나, 음영처리함

아래 <그림2>를 실행하면, 20번째 줄에서 위와 같은 에러가 난다. (price)
→ 그림만 참고하자.
※ 물론, 지금 사용자의 pc에서는 실행되지 않는다.
이유는? 바이비트 api 설치, api_key 및 api_secret를 발급받고,
주문이 이미 들어가 있어야 한다.

2) 딕셔너리 및 리스트형의 자료 추출 형태

받아오는 데이터의 태형(type)를 꼼꼼히 확인할 필요가 있다.
딕셔너리 - 리스트 - 딕셔너리 형태로 받아온다.

여기서 핵심은 딕셔너리는 문자형으로 값을 추출하여야 하고,
리시트형은 정수형 혹은 슬라이이스 형으로 추출한다는 것이다.

즉, 위의 에러는 '리스트형의 데이터'를 '딕셔너리형의 데이터' 형식으로 추출하려고 할 때 발생하는 오류이다.

그림1. 바이비트 주문(수량 1개, 청산가 21,000)이 제출된 화면
그림2. 20줄에서 에러 발생한 화면


3. 해결 방법

아래 <그림3> 23줄에서 확인하였듯이,
리스트형[0]으로 먼저 받아주고, 딕셔너리['price] 형태로 받아주면 된다.
(받아온 청산 가격 21000이 문자형(str)인게 특이하다. 가격이니깐 int형 인줄 알았다)

즉, <그림3>에서 확인하였듯이 바이비트 api를 통해

  • 15줄 : 받아온 데이터는 딕셔너리 형태이기 때문에 ['result'] 문자형으로 받았고
  • 19줄 : result 안에는 딕셔너리 형태이기 때문에, ['data'] 문자형로 값을 추출하고
  • 23줄 : data안에는 리스트 형태로 되어 있기 때문에, 첫번째 변수를 받기 위해서는 [0]인 숫자로 받고,
  • 23줄 : 리스트 형태의 첫번째 변수는 딕셔너리 형태로 이루어졌기 때문에 ['price'] 문자형으로 받는다.

 

그림3. 23번 줄에서 data 변수를 리스트로 받아주고, 딕셔너리로 받아주는 화면


4. 마치며

이번 오류 해결을 통해 알게 된건,
딕셔너리는 문자형으로 값(values)을 얻어오고,
리스트형은 숫자형으로 값(values)로 얻어온다는 것을 알았다.

데이터를 받아올 때, 데이터를 묶어오는 형태를 유심히 관찰해야겠다.
데이터를 다룰 때 그 형태에 좀더 많은 관심을 갖도록 하자.

반응형