#python #api #google-sheets
#python #API #google-sheets
Вопрос:
Проблема
Я тестирую Google Sheets и пытаюсь создать фильтр, который удаляет всех представителей, оставляя на листе только сенаторов. Я использую информацию на этом листе:
Код
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pprint import pprint
scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("creds.json", scope)
client = gspread.authorize(creds)
sheet = client.open("Congress").sheet1 # Open the spreadhseet
data = sheet.get_all_records() # Get a list of all records
rowCount = sheet.row_count
val = sheet.col_values(1)
i = 1
for value in val:
if value == 'rep':
print('Deleted:', sheet.cell(i,1).value, sheet.cell(i,5).value)
sheet.delete_row(i)
i = i 1
Я получаю:
Deleted: rep Young
Deleted: rep Roby
Deleted: rep Aderholt
Deleted: rep Palmer
Deleted: sen Jones
Deleted: rep Crawford
Deleted: rep Womack
В основном это удаляет только те, которые я выделил жирным шрифтом ниже:
Предполагается, что он удаляет все строки, в которых есть ‘rep’, но в конечном итоге удаляет не все из них, а также некоторые, в которых есть ‘sen’. Как мне решить эту проблему?
Ответ №1:
Вы удаляете строки во время выполнения итерации по ним. Оставшиеся строки сдвигаются вверх — это мешает вашей индексации — вы пропускаете некоторые строки и удаляете другие:
Пример:
line 0 rep someone
line 1 rep someone
line 2 sen someone
Вы зацикливаетесь на своих строках:
— вы тестируете строку 0, удаляете строку 0, строка 1 становится строкой 0
— далее вы тестируете строку 1 — все денди, это sen
— вы пропустили строку (первоначально 1, теперь 0)
и т.д.
Вместо этого удалите с обратной стороны:
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pprint import pprint
scope = ["https://spreadsheets.google.com/feeds",
'https://www.googleapis.com/auth/spreadsheets',
"https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("creds.json", scope)
client = gspread.authorize(creds)
sheet = client.open("Congress").sheet1 # Open the spreadhseet
data = sheet.get_all_records() # Get a list of all records
rowCount = sheet.row_count
val = sheet.col_values(1)
for idx,value in reversed(list(enumerate(val,1))):
if value == 'rep':
print('Deleted:', sheet.cell(idx,1).value, sheet.cell(idx,5).value)
sheet.delete_row(idx)