不會在背景上討論太多細節。myquery 東西運行一個從我的作業資料庫中提取的腳本。一切都被放入一個串列中。從那里它應該將所有內容轉儲到 Google Sheet 中,一次一行。當我只需要擔心兩個變數并且我可以使用諸如字典之類的二進制檔案時,效果很好。好吧,現在我得到了更多;4個類別,每個類別都需要在自己的線上。
我只需要將串列 (rawskudata) 拆分為分配給字典 (skuandimages) 的一組較小的串列 (comonant)。問題出在這一行:
skuandimages[c_list] = [rawskudata[int(c_sku)],rawskudata[int(c_img_url)],rawskudata[int(c_name)],rawskudata[int(c_quantity)]]
我得到 IndexError: list index out of range 。
基于我連續兩個小時盯著它,并使“indexerror”的每個谷歌搜索結果都變成紫色,這應該有效。它從其中提取的串列確實有索引號。我檢查了各種列印陳述句。為什么。為什么不是。我要死
mycursor = mydb.cursor()
skuandimages = {
}
myquery2 = #insert top secret query here
mycursor.execute(myquery2)
rawskudata = []
c_tag = 0
c_sku = 0
c_img_url = 1
c_name = 2
c_quantity = 3
print(mycursor)
for xy in mycursor:
for yx in range(2,6):
rawskudata.append(str(xy[yx]))
print(rawskudata)
for z in range(0,len(rawskudata)):
#skuandimages[str(x[2]) "-" str(x[3])] = x[4]
c_list = "componant" str(c_tag)
skuandimages[c_list] = [rawskudata[int(c_sku)], rawskudata[int(c_img_url)], rawskudata[int(c_name)], rawskudata[int(c_quantity)]]
#skuandimages[c_list] = [x for x]
c_sku = c_quantity 1
c_img_url = c_quantity 2
c_name = c_quantity 3
c_quantity = c_quantity 4
c_tag = 1
print(rawskudata) 回傳此資訊(為隱私而更改的資料):
['222001-1', 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Garden_strawberry_(Fragaria_×_ananassa)_single.jpg/440px-Garden_strawberry_(Fragaria_×_ananassa)_single.jpg', 'Strawberry', '1', '222014-1', 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Ripe,_ripening,_and_green_blackberries.jpg/440px-Ripe,_ripening,_and_green_blackberries.jpg', 'Blackberry', '1', '222053-1', 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Oranges_-_whole-halved-segment.jpg/440px-Oranges_-_whole-halved-segment.jpg', 'Oranges', '1', '222123-1', 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Autumn_Red_peaches.jpg/440px-Autumn_Red_peaches.jpg', 'Peaches', '1', '222203-1', 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Pears.jpg/440px-Pears.jpg', 'Pears', '1']
uj5u.com熱心網友回復:
您rawskudata一次從4 個中獲取資料,因此您希望回圈超過 1/4 中的專案數rawskudata
for z in range(0, int(len(rawskudata)/4)):
但是有一個更簡單的方法來解決這個問題。您可以將行后發生的所有內容替換mycursor.execute(myquery2)為:
for xy in mycursor:
skuandimages["componant" str(c_tag)] = [xy[2], xy[3], xy[4], xy[5]]
c_tag = c_tag 1
回饋
下面我寫了一些關于您撰寫??的代碼的反饋,希望對您學習 Python 有所幫助。
當你抓取資料時
for xy in mycursor:
for yx in range(2,6):
rawskudata.append(str(xy[yx]))
最好使用變數名
for row in mycursor:
for sku_item in range(2,6):
雖然命名在較小的應用程式中可能沒有那么重要,但它成為在較大的應用程式中撰寫代碼的最重要的事情之一,如果你將來回到你的代碼并且你試圖弄清楚它也會使事情變得更容易它能做什么。
該行將rawskudata.append(str(xy[yx]))資料轉換為字串。通常最好將資料保持原樣,直到您真正需要它作為字串。這樣,如果您想用它做其他事情,例如與產品數量進行比較,您將有能力這樣做。
在線上,for z in range(0,len(rawskudata)):而不是使用變數名,z這是一個標準約定i,index當您像這樣獲取串列中每個專案的索引時使用short是一種標準約定,或者有些人會將變數名_用于您從未在代碼中實際使用的變數。盡管當您使用模式for i in range(0, len(some_list)):而不是for some_value in some_list:.
在像skuandimages你這樣的字典中,有鍵和值。該變數c_list可以更好地命名,c_key因為它是字典鍵而不是串列。
線
skuandimages[c_list] = [rawskudata[int(c_sku)], rawskudata[int(c_img_url)], rawskudata[int(c_name)], rawskudata[int(c_quantity)]]
不需要將所有內容都轉換為整數,因為數字已經是整數。也許這只是您在嘗試找出 IndexError 時添加的內容,但在這里沒有必要。在這種情況下,如果 c_sku 等變數之一不是整數,我們希望自然發生錯誤。
線條
c_sku = c_quantity 1
c_img_url = c_quantity 2
c_name = c_quantity 3
c_quantity = c_quantity 4
看起來很奇怪,因為你把一切都建立在數量上。我更喜歡創建一個具有該迭代基值的新變數,然后您可以向其中添加 1、 2、 3、 4 等。在將產品欄位添加到以下內容之前獲取產品欄位也更常見skuandimages:
product_start_index = 0
for _ in range(0, int(len(rawskudata)/4)):
sku = rawskudata[product_start_index 0]
img_url = rawskudata[product_start_index 1]
name = rawskudata[product_start_index 2]
quantity = rawskudata[product_start_index 3]
key = "component" product_start_index
skuandimages[key] = [sku, img_url, name, quantity]
product_start_index = 4
或者,回到那 4 行,另一種選擇是
c_sku = 4
c_img_url = 4
c_name = 4
c_quantity = 4
每次通過回圈時,將 4 添加到這些變數中。(c_sku = 4是 的簡寫c_sku = c_sku 4)。現在沒有必要將數字作為基礎c_quantity
最后一項改進。有一個鮮為人知的功能range;第三個引數允許我們以 4s 計數而不是以 1s 計數。知道這一點,我們真的可以讓事情變得簡單
for i in range(0, len(rawskudata), 4):
sku = rawskudata[i 0]
img_url = rawskudata[i 1]
name = rawskudata[i 2]
quantity = rawskudata[i 3]
skuandimages["component" i] = [sku, img_url, name, quantity]
但就像我之前提到的,最好的解決方案是skuandimages從頭開始創建,而不是rawskudata:
for xy in mycursor:
skuandimages["componant" str(c_tag)] = [xy[2], xy[3], xy[4], xy[5]]
c_tag = c_tag 1
如果你真的想讓事情變得緊湊,這可以重寫為
for i, product_data in enumerate(mycursor):
skuandimages["componant " str(i)] = product_data[2:]
enumeratei每次我們回圈遍歷回圈時,都會給我們一個計數,1、2、3 等 as ,以及實際產品資料。product_data[2:]是獲取從第二項開始到串列末尾的子串列的速記方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373927.html
下一篇:無法從字典python中獲取資料
