From c996dbb30291dda4fbec466e71b718dab7f46a7d Mon Sep 17 00:00:00 2001 From: rafaelwerneck Date: Sun, 20 Jul 2025 09:44:22 -0300 Subject: [PATCH 1/2] Changing connection to IBGE from ftp:// to https:// --- ibgeparser/microdados.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ibgeparser/microdados.py b/ibgeparser/microdados.py index aa1fdd7..b3e7ceb 100644 --- a/ibgeparser/microdados.py +++ b/ibgeparser/microdados.py @@ -12,8 +12,8 @@ log = Log() log.init() -URL_DOCUMENTACAO='ftp://ftp.ibge.gov.br/Censos/{}/Resultados_Gerais_da_Amostra/Microdados/Documentacao.zip' -URL_MICRODADOS='ftp://ftp.ibge.gov.br/Censos/{}/Resultados_Gerais_da_Amostra/Microdados/{}.zip' +URL_DOCUMENTACAO='https://ftp.ibge.gov.br/Censos/{}/Resultados_Gerais_da_Amostra/Microdados/Documentacao.zip' +URL_MICRODADOS='https://ftp.ibge.gov.br/Censos/{}/Resultados_Gerais_da_Amostra/Microdados/{}.zip' ARQUIVO_LAYOUT='Layout_microdados_Amostra.xls' DIRETORIO_SAIDA='microdados-ibge' From d4f6ac7346c084961d581c1a0f697ec05a59773d Mon Sep 17 00:00:00 2001 From: rafaelwerneck Date: Sun, 20 Jul 2025 09:54:52 -0300 Subject: [PATCH 2/2] Change file reading to be in chunks to avoid errors when obtaining the data --- ibgeparser/microdados.py | 76 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/ibgeparser/microdados.py b/ibgeparser/microdados.py index b3e7ceb..e0166c4 100644 --- a/ibgeparser/microdados.py +++ b/ibgeparser/microdados.py @@ -149,43 +149,45 @@ def obter_dados_ibge(self, ano:enumerate, estados:list, modalidades:list, header # extraindo csv de todos os estados selecionados pelo usuario no pacote for enum_estado in estados: - try: - valor_estado, estado, sigla = enum_estado.value - - log.info('Baixando informações do estado de {}'.format(estado)) - - url = URL_MICRODADOS.format(descricao_ano, sigla) - log.debug('Arquivo referente ao estado de {} extraído de: {}'.format(estado, url)) - - # download dos dados do estado - arquivo_zip_estado = self.__download_arquivo(url, os.path.join(pasta_temporaria, url.split('/')[-1])) - log.debug('Arquivo zip do estado salvo em: {}'.format(arquivo_zip_estado)) - - for enum_modalidade in modalidades: - try: - valor_modalidade, descricao_modalidade = enum_modalidade.value - - nome_arquivo_modalidade = 'Amostra_{}_{}.txt'.format(descricao_modalidade, str(valor_estado)) - log.debug('Nome arquivo modalidade: {}'.format(nome_arquivo_modalidade)) - - # extração do zip de dados do estado - arquivo_estado = self.__extrair_arquivo(arquivo_zip_estado, nome_arquivo_modalidade, pasta_temporaria) - log.debug('Arquivo do estado extraído em: {}'.format(arquivo_estado)) - - # conversão para csv - data = pd.read_fwf(arquivo_estado, colspecs=div_columns[descricao_modalidade]) - data.columns = ibge_datasets[descricao_modalidade]['VAR'].tolist() - - # salvando o csv - arquivo_csv = os.path.join(pasta_trabalho, '{}_{}.csv'.format(nome_arquivo_modalidade[:-4], sigla)) - data.to_csv(arquivo_csv, encoding="utf-8-sig", header=header) - - log.info('Arquivo de {} de modalidade {} extraído'.format(sigla, descricao_modalidade)) - log.debug('Arquivo de {} de modalidade {} extraído em: {}'.format(sigla, descricao_modalidade, arquivo_csv)) - except Exception as e: - log.error('Erro ao processar os dados de documentação: {}'.format(e)) - except Exception as e: - log.error('Erro ao baixar os dados do estado: {}'.format(e)) + valor_estado, estado, sigla = enum_estado.value + + log.info('Baixando informações do estado de {}'.format(estado)) + + url = URL_MICRODADOS.format(descricao_ano, sigla) + log.debug('Arquivo referente ao estado de {} extraído de: {}'.format(estado, url)) + + # download dos dados do estado + arquivo_zip_estado = self.__download_arquivo(url, os.path.join(pasta_temporaria, url.split('/')[-1])) + log.debug('Arquivo zip do estado salvo em: {}'.format(arquivo_zip_estado)) + + for enum_modalidade in modalidades: + valor_modalidade, descricao_modalidade = enum_modalidade.value + + nome_arquivo_modalidade = 'Amostra_{}_{}.txt'.format(descricao_modalidade, str(valor_estado)) + log.debug('Nome arquivo modalidade: {}'.format(nome_arquivo_modalidade)) + + # extração do zip de dados do estado + arquivo_estado = self.__extrair_arquivo(arquivo_zip_estado, nome_arquivo_modalidade, pasta_temporaria) + log.debug('Arquivo do estado extraído em: {}'.format(arquivo_estado)) + + # conversão para csv + data = pd.read_fwf(arquivo_estado, colspecs=div_columns[descricao_modalidade], chunksize=100000) + data.columns = ibge_datasets[descricao_modalidade]['VAR'].tolist() + + # salvando o csv + header_now = header + arquivo_csv = os.path.join(pasta_trabalho, '{}_{}.csv'.format(nome_arquivo_modalidade[:-4], sigla)) + for chunk in data: + log.debug(f'Escrevendo chunk de dados no arquivo {arquivo_csv} com header {header_now}') + if header_now: + chunk.to_csv(arquivo_csv, encoding="utf-8-sig", header=data.columns, mode='w') + else: + chunk.to_csv(arquivo_csv, encoding="utf-8-sig", header=header_now, mode='a') + header_now = False + # data.to_csv(arquivo_csv, encoding="utf-8-sig", header=header) + + log.info('Arquivo de {} de modalidade {} extraído'.format(sigla, descricao_modalidade)) + log.debug('Arquivo de {} de modalidade {} extraído em: {}'.format(sigla, descricao_modalidade, arquivo_csv)) # apaga a pasta criada no diretório temporario self.__remover_pasta_temporariaoraria(pasta_temporaria)