Может ли кто-нибудь помочь мне с этой проблемой с помощью python и Google sheets api?

#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)