TypeError: tuple-indices moeten gehele getallen zijn, niet str

Ik probeer gegevens uit een database te halen en toe te wijzen aan verschillende lijsten.
Deze specifieke fout geeft me veel problemen “TypeError: tuple-indexen moeten gehele getallen zijn, niet str”
Ik heb geprobeerd het te converteren naar float en etc, maar zonder succes.

De code gaat als volgt

conn=MySQLdb.connect(*details*)
cursor=conn.cursor()
ocs={}
oltv={}
query="select pool_number, average_credit_score as waocs, average_original_ltv as waoltv from *tablename* where as_of_date= *date*"
cursor.execute(query)
result=cursor.fetchall()
for row in result:
 print row
 ocs[row["pool_number"]]=int(row["waocs"])
 oltv[row["pool_number"]]=int(row["waoltv"])

Voorbeelduitvoer van printopdracht is als volgt:

('MA3146', 711L, 81L)
('MA3147', 679L, 83L)
('MA3148', 668L, 86L)

En dit is precies de foutmelding die ik krijg:

ocs[row["pool_number"]]=int(row["waocs"])
TypeError: tuple indices must be integers, not str

Alle hulp wordt op prijs gesteld! Bedankt mensen!


Antwoord 1, autoriteit 100%

Zoals de fout zegt, is roween tuple, dus je kunt row["pool_number"]niet doen. Je moet de index gebruiken: row[0].


Antwoord 2, autoriteit 46%

Ik denk dat je dat moet doen

for index, row in result: 

Als je toegang wilt krijgen op naam.


Antwoord 3, autoriteit 16%

TL;DR: voeg de parameter cursorclass=MySQLdb.cursors.DictCursortoe aan het einde van uw MySQLdb.connect.


Ik had een werkende code en de DB is verplaatst, ik moest de host/gebruiker/pas wijzigen. Na deze wijziging werkte mijn code niet meer en kreeg ik deze foutmelding. Bij nadere inspectie heb ik de verbindingsreeks gekopieerd en geplakt op een plaats met een extra richtlijn. De oude code luidde als volgt:

conn = MySQLdb.connect(host="oldhost",
                        user="olduser",
                        passwd="oldpass",
                        db="olddb", 
                        cursorclass=MySQLdb.cursors.DictCursor)

Die werd vervangen door:

conn = MySQLdb.connect(host="newhost",
                        user="newuser",
                        passwd="newpass",
                        db="newdb")

De parameter cursorclass=MySQLdb.cursors.DictCursoraan het eind zorgde ervoor dat python me toegang gaf tot de rijen met de kolomnamen als index. Maar de slechte copy-paste elimineerde dat, wat de fout opleverde.

Dus als alternatief voor de oplossingen die al zijn gepresenteerd, kunt u deze parameter ook toevoegen en toegang krijgen tot de rijen op de manier die u oorspronkelijk wilde. ^_^ Ik hoop dat dit anderen helpt.


Antwoord 4, autoriteit 6%

Het probleem is hoe u toegang krijgt tot row

Met name row["waocs"]en row["pool_number"]van ocs[row["pool_number"]]=int(row["waocs"])

Als je de officiële -documentatievan fetchall()die je vindt.

De methode haalt alle (of alle resterende) rijen van een queryresultatenset op en retourneert een lijst met tuples.

Daarom moet je toegang krijgen tot de waarden van rijen met row[__integer__]zoals row[0]


Antwoord 5, autoriteit 3%

Alleen het toevoegen van een parameter zoals de onderstaande werkte voor mij.

cursor=conn.cursor(dictionary=True)

Ik hoop dat dit ook nuttig zou zijn.


Antwoord 6, autoriteit 3%

Ik weet dat het niet specifiek voor deze vraag is, maar voor iedereen die binnenkomt via een Google-zoekopdracht: deze fout wordt ook veroorzaakt door een komma achter een object dat een tuple maakt in plaats van een woordenboek

>>>dict = {}
>>>tuple = {},

Tupel

>>>tuple_ = {'key' : 'value'},
>>>type(tuple_)
<class 'tuple'>

Woordenboek

>>>dict_ = {'key' : 'value'} 
>>>type(dict_)        
<class 'dict'>

Antwoord 7

SQlite3 heeft een methode met de naam row_factory. Met deze methode krijgt u toegang tot de waarden op kolomnaam.

https://www.kite.com/python/examples/3884/sqlite3-use-a-row-factory-to-access-values-by-column-name


Antwoord 8

Ik zie dat je probeert te identificeren aan de hand van de naam van een rij. Als u op zoek bent naar een specifieke kolom binnen de rij, kunt u [integer][kolomnaam]

doen

Als u bijvoorbeeld elke rij wilt doorlopen en alleen de waarde uit de rij wilt halen met de kolomkop ‘poolnummer’, kunt u dit doen:

for row in df_updated.iterrows():
    cell = row[1]['pool number']
    print(cell)

De code herhaalt dan elke rij, maar drukt alleen de waarde af die overeenkomt met de kolom ‘poolnummer’

Other episodes