Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extrair arquivos do FTP do DataSUS sem corromper #27

Closed
bcbernardo opened this issue Aug 16, 2022 · 0 comments · Fixed by #28
Closed

Extrair arquivos do FTP do DataSUS sem corromper #27

bcbernardo opened this issue Aug 16, 2022 · 0 comments · Fixed by #28
Assignees
Labels
bug Something isn't working

Comments

@bcbernardo
Copy link
Contributor

bcbernardo commented Aug 16, 2022

Atualmente, boa parte das extrações de dados do FTP público do DataSUS (ftp.datasus.gov.br) falha com uma mensagem semelhante a esta:

2022-08-15 06:04:19.769 | ERROR    | impulso***.utilitarios.datasus_ftp:_checar_arquivo_corrompido:40 - Tamanho no servidor é maior do que o do arquivo baixado.
2022-08-15 at 06:04:19 | ERROR | datasus_ftp.py:40: Tamanho no servidor é maior do que o do arquivo baixado.
2022-08-15 06:04:19.771 | ERROR    | impulso***.scripts.geral:***:95 - An error has been caught in function '***', process 'MainProcess' (1), thread 'MainThread' (139749888595776):
Traceback (most recent call last):

  File "src/impulso***/__main__.py", line 14, in <module>
    ***()
    └ <function *** at 0x7f1a0e483c10>

  File "/home/appuser/.local/lib/python3.8/site-packages/impulso***/***.py", line 17, in ***
    capturas_uso_geral(sessao=sessao, teste=teste)
    │                         │             └ False
    │                         └ <sqlalchemy.orm.session.Session object at 0x7f1a0e5089a0>
    └ <function *** at 0x7f19eb4840d0>
> File "/home/appuser/.local/lib/python3.8/site-packages/impulso***/scripts/geral.py", line 95, in ***
    vinculos_disseminacao(sessao=sessao, teste=teste)
    │                            │             └ False
    │                            └ <sqlalchemy.orm.session.Session object at 0x7f1a0e5089a0>
    └ <function vinculos_disseminacao at 0x7f19eb533a60>
  File "/home/appuser/.local/lib/python3.8/site-packages/impulso***/scripts/geral.py", line 37, in vinculos_disseminacao
    obter_vinculos(
    └ <function obter_vinculos at 0x7f19eb533700>
  File "/home/appuser/.local/lib/python3.8/site-packages/impulso***/cnes/vinculos.py", line 382, in obter_vinculos
    for vinculos_lote in vinculos_lotes:
                         └ <generator object extrair_dbc_lotes at 0x7f19ead95a50>
  File "/home/appuser/.local/lib/python3.8/site-packages/impulso***/utilitarios/datasus_ftp.py", line [114](https://github.com/ImpulsoGov/etl/runs/7832903075?check_suite_focus=true#step:5:115), in extrair_dbc_lotes
    raise RuntimeError(

RuntimeError: A extração da fonte `ftp.datasus.gov.br/dissemin/publicos/CNES/200508_/Dados/PF` falhou porque o arquivo baixado está corrompido.

Este comportamento é o esperado, e é motivado pelo fato de a função impulsoetl.utilitarios.datasus_ftp._checar_arquivo_corrompido() detectar que o arquivo baixado tem alguns bytes a menos do que o tamanho informado pelo servidor FTP. Para evitar enviar dados corrompidos para o banco de dados, um erro RuntimeError é levantado e a captura é interrompido.

Esta issue consiste em tentar alterar a função impulsoetl.utilitarios.datasus_ftp.extrair_dbc_lotes() de forma que este erro seja menos recorrente.

@bcbernardo bcbernardo self-assigned this Aug 16, 2022
@bcbernardo bcbernardo added the bug Something isn't working label Aug 16, 2022
@bcbernardo bcbernardo changed the title Extrair arquivos do FTP do DataSUS em modo binário/em blocos Extrair arquivos do FTP do DataSUS sem corromper Aug 16, 2022
bcbernardo added a commit that referenced this issue Aug 16, 2022
…taSUS

Substitui a função `FTP.retrbinary()` do módulo `ftplib` pela função `requests.urlopen()` do módulo `urllib` como ferramenta para baixar dados do FTP público do DataSUS.

Fixes #27 .
bcbernardo added a commit that referenced this issue Aug 16, 2022
…taSUS (#28)

Substitui a função `FTP.retrbinary()` do módulo `ftplib` pela função `requests.urlopen()` do módulo `urllib` como ferramenta para baixar dados do FTP público do DataSUS.

Fixes #27 .
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant