Как увеличить переменную в пределах l oop in python - PullRequest
0 голосов
/ 27 мая 2020

Я создаю таблицу Google, чтобы отслеживать цены на акции, которыми я владею. У меня работает API, подключенный к Google Таблицам и моему собственному приложению python.

Мой лист Google выглядит так

Stock | Previous close

AAPL  | 316.73

NVDA  | 348.71

SPOT  | 191.00

В настоящее время у меня работает следующий код.

import requests 
import gspread
from oauth2client.service_account import ServiceAccountCredentials 

sheet = client.open("Stock").sheet1
AAPL = sheet.cell(2,1).value
url = ('https://ca.finance.yahoo.com/quote/'+AAPL+'?p='+AAPL+'&.tsrc=fin-srch')
response = requests.get(url) 
htmltext = response.text
splitlist = htmltext.split("Previous Close")
afterfirstsplit =splitlist[1].split("\">")[2]
aftersecondsplit = afterfirstsplit.split("</span>")
datavalue = aftersecondsplit[0] 
sheet.update_cell(2,2,datavalue) 

# это обновит значение в моем листе Google до предыдущей цены закрытия

Для каждой отдельной акции я бы скопировал и вставил, изменил символ акции, чтобы найти значение следующей цитаты. Я знаю, что есть способ использовать операторы FOR для автоматизации этого процесса. Я пробовал это со следующим, но он не обновлялся по мере необходимости. В этот момент я достиг стены и был бы признателен за любую помощь или понимание того, как я могу автоматизировать эту функцию.

tickers = {sheet.cell(2,1).value : [],
           sheet.cell(3,1).value : [],
           sheet.cell(4,1).value : [], 
           sheet.cell(5,1).value :[]}

for symbols in tickers: 

    url = ('https://ca.finance.yahoo.com/quote/'+symbols+'?p='+symbols+'&.tsrc=fin-srch')
    response = requests.get(url) 
    htmltext = response.text
    splitlist = htmltext.split("Previous Close")
    afterfirstsplit =splitlist[1].split("\">")[2]
    aftersecondsplit = afterfirstsplit.split("</span>")
    datavalue = aftersecondsplit[0]
    sheet.update.cell(2,1,datavalue)
    print (datavalue)

При этом собираются все значения текущих цен акций и импортируются в файл Excel, но только с одной координатой. Я не знаю, как увеличивать «1» в sheet.update.cell (2,1, datvalue) каждый раз в инструкции FOR. Я считаю, что это способ решить эту проблему, но если у кого-то есть другие предложения, я все уши.

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Что касается ответа на эту часть вашего вопроса:

"Я не знаю, как увеличить" 1 "в sheet.update.cell (2,1, datvalue), каждый время в операторе FOR. "

Вот как вы увеличиваете счетчик внутри for l oop обычно:

counter = 1

for symbol in tickers:
    #Your code
    sheet.update.cell(2,counter,datavalue)
    counter = counter+1
1 голос
/ 27 мая 2020

В то время как переменные-счетчики являются очень распространенным шаблоном, используемым в большинстве языков программирования (см. ответ Акиба Раста ), более pythoni c способ сделать это - использовать встроенную команду enumerate функция :

for column, symbol in enumerate(tickers, start=1):
    # do stuff
    sheet.update.cell(2,column,datavalue)

что такое enumerate?

Как указано в документации, enumerate принимает то, что вы можете перебирать (например, список), и возвращает кортеж со счетчиком в качестве первого элемента и элементов из итератора в качестве второго элемента:

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons, start=1))
# outputs [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

Он также имеет то преимущество, что делает это эффективно с точки зрения памяти и напрямую привязан к вашему l oop.

почему в моем for l oop?

Это просто синтаксис c сахар в python, который позволяет распаковать кортеж или список :

alist = [1, 2, 3]
first, second, third = alist
print(third) # outputs 3
print(second) # outputs 2
print(first) # outputs 1

Поскольку enumerate возвращает кортеж, вы в основном назначаете каждый элемент в этом кортеже другой переменной одновременно.

...