`IndexError` no adaptador Selic
b-macedo opened this issue · 7 comments
Prezado(a)(s),
Gostaria de sanar uma dúvida:
- Primeiro, eu utilizei este código, e o scrip funcionou perfeitamente:
from datetime import date
from decimal import Decimal
from calculadora_do_cidadao import Ipca
ipca=Ipca()
str_date_inicial = '01/04/2010'
str_date_final = '05/05/2011'
valorInicial = 1000
multiplicador = ipca.adjust(str_date_inicial, 1, str_date_final)
print(multiplicador*valorInicial)
- Em seguinte, tentei rodar o mesmo script, apenas trocando as respectivas variáveis para a Selic, ou seja:
from datetime import date
from decimal import Decimal
from calculadora_do_cidadao import Selic
selic = Selic()
str_date_inicial = '01/04/2010'
str_date_final = '05/05/2011'
valorInicial = 1000
multiplicador = selic.adjust(str_date_inicial, 1, str_date_final)
print(multiplicador*valorInicial)
Foi então que o sistema retornou o erro abaixo:
`C:\Users\trtrj\AppData\Local\Programs\Python\Python310\python.exe C:\Users\trtrj\Desktop\PycharmProjects\pythonProject2\correçãoMonetária.py
Traceback (most recent call last):
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\download.py", line 94, in __call__
yield path
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 206, in download
for data in self.read_from(path, **kwargs): # type: ignore
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\rows\plugins\plugin_html.py", line 84, in import_from_html
table = tables[index]
IndexError: list index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 617, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\trtrj\\AppData\\Local\\Temp\\tmpt07hhrhc\\taxa-de-juros-selic'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 843, in onerror
_os.unlink(path)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\trtrj\\AppData\\Local\\Temp\\tmpt07hhrhc\\taxa-de-juros-selic'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\trtrj\Desktop\PycharmProjects\pythonProject2\correçãoMonetária.py", line 20, in <module>
selic = Selic()
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 71, in __init__
self.data = {key: value for key, value in self.download()}
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 71, in <dictcomp>
self.data = {key: value for key, value in self.download()}
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 204, in download
with download() as path:
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\contextlib.py", line 153, in __exit__
self.gen.throw(typ, value, traceback)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\download.py", line 86, in __call__
with TemporaryDirectory() as tmp:
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 869, in __exit__
self.cleanup()
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 873, in cleanup
self._rmtree(self.name, ignore_errors=self._ignore_cleanup_errors)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 855, in _rmtree
_shutil.rmtree(name, onerror=onerror)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 749, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 619, in _rmtree_unsafe
onerror(os.unlink, fullname, sys.exc_info())
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 846, in onerror
cls._rmtree(path, ignore_errors=ignore_errors)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 855, in _rmtree
_shutil.rmtree(name, onerror=onerror)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 749, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 600, in _rmtree_unsafe
onerror(os.scandir, path, sys.exc_info())
File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 597, in _rmtree_unsafe
with os.scandir(path) as scandir_it:
NotADirectoryError: [WinError 267] The directory name is invalid: 'C:\\Users\\trtrj\\AppData\\Local\\Temp\\tmpt07hhrhc\\taxa-de-juros-selic'
Process finished with exit code 1`
Pode(m) me dar alguma sugestão?
Muito obrigado
Oi, @b-macedo. Formatei tua mensagem para facilitar a leitura com a formatação, espero que não se importe. Também editei o título para algo que descreva melhor o problema que você está reportando.
Aparentemente a fonte dos dados da Selic deve ter mudado ou a URL, ou o formato dos dados, teremos que atualizar o adaptador se for esse o caso. Ou eles estão temporariamente fora do ar (aí não tem o que fazer).
Vou tentar olhar com calma nos próximos dias, mas já marcando aqui como bug!
Atualizando:
A URL do adaptador Selic mudou: a que temos aqui no repositório está redirecionando
para a página de inicial da Receita Federal.
Provavelmente o que precisamos:
- identificar a nova URL onde se encontram esses dados
- identificar se o formato dos dados permanece o mesmo
Para referência, essa é uma página da versão antiga.
Achei os dados em outra URLm em JSON. Agora temos que refatorar o adaptador… E ver como adaptar essas faixas temporais (que agora tem dia, mês e ano, de invés de mês e ano apenas).
Achei uma fonte melhor ainda, que dá a Selic por mês, se encaixa melhor no projeto. Um pequeno rascunho para quem for implementar:
from urllib.parse import urlencode
from requests import post
PARAMS = {
"parametrosOrdenacao": '[{"nome":"periodo","decrescente":false}]',
"page": 1,
"pageSize": 48,
}
URL = "https://www3.bcb.gov.br/novoselic/rest/fatoresAcumulados/pub/search?"
HEADERS = {
"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br",
}
DATA = {
"campoPeriodo": "mensal",
"dataInicial": "",
"dataFinal": "",
"ano": 1986,
"exibirMeses": True,
}
print(post(f"{URL}?{urlencode(PARAMS)}", json=DATA, headers=HEADERS).json())
A saída:
{
"totalItems": 7,
"registros": [
{
"periodo": "Jun / 1986",
"fator": 1.01270736,
"fatorFormatado": "1,01270736"
},
{
"periodo": "Jul / 1986",
"fator": 1.01945876,
"fatorFormatado": "1,01945876"
},
{
"periodo": "Aug / 1986",
"fator": 1.02567386,
"fatorFormatado": "1,02567386"
},
{
"periodo": "Sep / 1986",
"fator": 1.02941789,
"fatorFormatado": "1,02941789"
},
{
"periodo": "Oct / 1986",
"fator": 1.0195615,
"fatorFormatado": "1,01956150"
},
{
"periodo": "Nov / 1986",
"fator": 1.02369179,
"fatorFormatado": "1,02369179"
},
{
"periodo": "Dec / 1986",
"fator": 1.05466504,
"fatorFormatado": "1,05466504"
}
],
"observacoes": null,
"dataAtual": "01/11/2022 \u00e0s 18:57:03"
}
@b-macedo, creio estar funcionando na versão nova, a 0.5.4 — pip install -U calculadora_do_cidadao
se quiser atualizar : )
@cuducos não tenho como te agradecer, meu querido. Obrigado por toda a sua atenção. Pra falar a verdade, não tinha compreendido a sua primeira sugestão (sou leigo no assunto) e não quis abusar de sua ajuda.
Mas agora, pela própria calculadora, a solução fica muito mais fácil pra mim.
muitíssimo grato, Deus te pague.
@b-macedo, apenas um pequeno comentário: reparei que em comparação com a ferramenta de conversão online do BC dá um diferença pequena. Acredito que seja questão de um estar indexado dia-a-dia (o deles) e esse pacote ser mês a mês. Acho bom ressaltar, pois dependendo do caso isso pode ser ou não problema : )