Ошибка типа: объект 'int' не является подписным. Где находится int?

0

Я получил ошибку, TypeError: 'int' object is not subscriptable. Я хочу подключить 2 файла excel Изображение 174551

Изображение 174551 для модели пользователя.

Поэтому мой идеальный выход

1|1|Blear|40|false|l|America|A|1
2|5|Tom|23|true|o|UK|A|3
3|9|Rose|52|false|m
4|10|Karen||||Singapore|C|2

Например, данные Rose из user_id = 3 не во втором excel, в этом случае, если 2-я информация пустая, это нормально. Я думаю, что для 2-го класса excel в словаре используется модель User.

Я искал ошибки, я думал, что эта часть for data in data_dict была неправильной, я изменил ее на for data in range(len(data_dict)) но произошла такая же ошибка. Я действительно не могу понять, где это неправильно. Как я должен это исправить?

Теперь view.py

#coding:utf-8
from django.shortcuts import render
import xlrd
from .models import User

book = xlrd.open_workbook('../data/excel1.xlsx')
sheet = book.sheet_by_index(1)

def build_employee(employee):
  if employee == 'leader':
     return 'l'
  if employee == 'manager':
     return 'm'
  if employee == 'others':
     return 'o'

for row_index in range(sheet.nrows):
  rows = sheet.row_values(row_index) 
  is_man = rows[4] != ""
  emp = build_employee(rows[5])
  user = User(user_id=rows[1], name_id=rows[2], name=rows[3], 
              age=rows[4],man=is_man,employee=emp)
  user.save()

book2 = xlrd.open_workbook('../data/excel2.xlsx')
sheet2 = book2.sheet_by_index(0)
headers = sheet2.row_values(0)

large_item = None
data_dict = {}
for row_index in range(sheet2.nrows):
    rows2 = sheet2.row_values(row_index)
    large_item = rows2[1] or large_item

    # Create dict with headers and row values
    row_data = {}
    for idx_col, value in enumerate(rows2):
        header_value = headers[idx_col]
        # Avoid to add empty column. A column in your example
        if header_value:
            row_data[headers[idx_col]] = value
            # Add row_data to your data_dict with
    data_dict[row_index] = row_data
    for row_number, row_data in data_dict.items():
        user1 = User.objects.filter(user_id = data['user_id']).exists()
        if user1:
            user1.__dict__.update(**data_dict)
            user1.save()

Теперь Traceback

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/XXX/testapp/app/views.py", line 123, in <module>
    user1 = User.objects.filter(user_id = row_data['user_id']).exists()
KeyError: 'user_id'
  • 2
    Что такое трассировка стека этой ошибки?
  • 2
    Опубликовать полную трассировку стека
Показать ещё 7 комментариев
Теги:
excel

1 ответ

2
Лучший ответ

data являются целыми числами. Поэтому вызов данных, таких как dict, вызывает это искушение.

>>> a=1
>>> a['a']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not subscriptable

Почему это int? Поскольку вы выполняете итерацию по ключам data:

>>> a={1: 'x', 2: 'c'}
>>> for i in a: print(i)
... 
1
2

Попробуйте использовать items() как таковые:

>>> for key, value in a.items(): print(key, value)
... 
1 x
2 c

Или, в вашем конкретном случае:

for row_number, row_data in data_dict.items():
    print(row_number, row_data)

Подробнее см. Методы циклы для документации по dict.

  • 0
    должен ли он / она получить ключевую ошибку в data['user_id'] в этом случае ??
  • 0
    KeyError - это когда данные являются диктовкой, но ключ в них не найден.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню