"""Registra o SHA-256 de todos os arquivos de entrada usados na análise e na validação. Permite que outra pessoa confira se baixou exatamente os mesmos arquivos (o DATASUS e o OpenDataSUS podem republicar versões corrigidas). Saída: resultados/hashes_entradas.csv Uso: python registrar_hashes.py """ import hashlib import pandas as pd from config import ANOS, ANOS_VALIDACAO, BRUTOS, RESULTADOS, UFS def sha256(caminho): h = hashlib.sha256() with open(caminho, "rb") as f: while bloco := f.read(1 << 20): h.update(bloco) return h.hexdigest() def main(): arquivos = [("principal", BRUTOS / "sim" / f"DO{uf}{ano}.dbc") for ano in ANOS for uf in UFS] arquivos += [("validacao", BRUTOS / "sim_csv" / f"Mortalidade_Geral_{ano}.csv") for ano in ANOS_VALIDACAO] arquivos += [("equivalencia", BRUTOS / "sim_csv" / "Mortalidade_Geral_2020.csv")] arquivos += [("fase1b_rhc", BRUTOS / "rhc" / f"rhc_{ano}.zip") for ano in range(2015, 2024)] arquivos += [("fase1b_rhc_com_sp", BRUTOS / "rhc" / f"rhc_sp_{ano}.zip") for ano in range(2015, 2024)] arquivos += [("fase2", p) for p in sorted((BRUTOS / "fase2").glob("*.json"))] arquivos += [("fase2b", p) for p in sorted((BRUTOS / "fase2b").glob("*.json"))] arquivos += [("fase2b_cnes_campos_extraidos", p) for p in sorted((BRUTOS / "fase2b").glob("cnes_*.csv"))] arquivos += [("fase1c_sim", BRUTOS / "sim" / f"DO{uf}{ano}.dbc") for ano in range(1996, 2015) for uf in UFS] arquivos += [("fase1c", p) for p in sorted((BRUTOS / "fase1c").glob("*.json"))] arquivos += [("fase1c_amc", BRUTOS / "fase1c" / "AMC_1991_2010_simplified.gpkg")] for nome, uso in [("populacao_censo2022.csv", "principal"), ("populacao_censo2010.csv", "validacao"), ("populacao_estimativas_anuais.csv", "sensibilidade"), ("municipios.json", "principal"), ("malha_municipios.geojson", "principal"), ("malha_ufs.geojson", "principal")]: arquivos.append((uso, BRUTOS / nome)) linhas = [{"uso": uso, "arquivo": str(p.relative_to(BRUTOS)), "bytes": p.stat().st_size, "sha256": sha256(p)} for uso, p in arquivos if p.exists()] faltam = [str(p.relative_to(BRUTOS)) for _, p in arquivos if not p.exists()] df = pd.DataFrame(linhas) df.to_csv(RESULTADOS / "hashes_entradas.csv", index=False) print(df.groupby("uso").size().to_string()) if faltam: print("Arquivos ausentes:", faltam) return df if __name__ == "__main__": main()