Página 1 de 1

Ainda aprendendo Python...

Enviado: 21 Jun 2025 14:12
por toya
Carecendo exercitar o meu aprendizado como neófito Pythoneiro me arrisquei a converter a Tabela de CST e Classificações Tributárias da nova Reforma Tributária do Consumo do Excel para o CSV.
Na conversão fiz os ajustes necessários adaptando os campos às minhas necessidades.
Como aprendiz estou aberto a sugestões e críticas...
Link do arquivo Excel: https://dfe-portal.svrs.rs.gov.br/Dfe/Documentos#

Código: Selecionar todos

import pandas as pd
import unicodedata

def remover_acentos(texto):
    if isinstance(texto, str):
        texto_normalizado = unicodedata.normalize('NFD', texto)
        texto_sem_acentos = texto_normalizado.encode('ascii', 'ignore').decode('utf-8')
        return texto_sem_acentos
    return texto  # Não altera se não for string

def converter_via_pandas(arq_csv, arq_xlsx):
    df = pd.read_excel(arq_xlsx, sheet_name='cClass',
                       dtype={"CST-IBS/CBS": str,
                              "cClassTrib": str,
                              "pRedIBS": str,
                              "pRedCBS": str,
                              "ind_RedutorBC": str,
                              "ind_gTribRegular": str,
                              "ind_CredPres": str,
                              "indMono": str,
                              "indMonoReten": str,
                              "indMonoRet": str,
                              "indMonoDif": str})
    # preenche NaN com vazio
    df = df.fillna("")

    # Se colunas com inteiros transformados em string:
    for col in df.select_dtypes(include=['int64']):
        df[col] = df[col].astype(str)

    # Se quiser arredondar floats como antes:
    for col in df.select_dtypes(include=['float']):
        df[col] = df[col].round(2)

    # Aplica a função de remoção de acentos apenas nas colunas do tipo string
    for col in df.select_dtypes(include=['object']):
        df[col] = df[col].map(remover_acentos)

    csv_cabec = []
    csv_dados = []
    dados = []
    for i in range(len(df.columns)):
        if i in [0, 1, 4, 5]:
            pass
        else:
            coluna = df.columns[i].replace(" ", "_")
            coluna = coluna.replace("/", "_")
            coluna = remover_acentos(coluna).upper()
            csv_cabec.append(coluna)
    # print(csv_cabec)
    # print(type(csv_cabec))

    for y in range(df.shape[0]):
        for x in range(df.shape[1]):
            dado = df.iat[y, x].replace("\n", "")
            if x in [0, 1, 4, 5]:
                pass
            else:
                if x == 17:
                    if "Fornecedor" in dado:
                        dado = "01"
                    elif "Adquirente" in dado:
                        dado = "02"
                    else:
                        dado = "99"
                dados.append(dado)
        csv_dados.append(dados)
        dados =[]

    csv_texto = ""
    for i in range(len(csv_cabec)):
        csv_texto = f'{csv_texto}{csv_cabec[i]}'
        if i < len(csv_cabec)-1:
            csv_texto = f'{csv_texto};'
    csv_texto = f'{csv_texto}\n'
    for i in range(len(csv_dados)):
        for j in range(len(csv_dados[i])):
            csv_texto = f'{csv_texto}{csv_dados[i][j]}'
            if j < len(csv_dados[i])-1:
                csv_texto = f'{csv_texto};'
        csv_texto = f'{csv_texto}\n'

    # print(f'csv_texto:\n{csv_texto}')
    with open(csv_file, "w") as arquivo:
        arquivo.write(csv_texto)

csv_file = "./csv/rtc_cclasstrib_20250618.csv"
xlsx_file = "./xlsx/CST_cClassTribPublicacao_20250618.xlsx"

converter_via_pandas(csv_file, xlsx_file)




Ainda aprendendo Python...

Enviado: 28 Jun 2025 01:51
por mauricioportela
ola!

testa isso:

Código: Selecionar todos

    # for i in range(len(df.columns)):
    #     if i in [0, 1, 4, 5]:
    #         pass
    #     else:
    #         coluna = df.columns[i].replace(" ", "_")
    #         coluna = coluna.replace("/", "_")
    #         coluna = remover_acentos(coluna).upper()
    #         csv_cabec.append(coluna)

    for i in range(len(df.columns)):
        if i not in [0, 1, 4, 5]:
            csv_cabec.append(remover_acentos(df.columns[i]).upper().replace(" ", "_").replace("/", "_"))

    # ou

    csv_cabec = [remover_acentos(c).upper().replace(" ", "_").replace("/", "_") for i, c in enumerate(df.columns) if i not in [0, 1, 4, 5]]

Att.
Mauricio Portela

Ainda aprendendo Python...

Enviado: 01 Jul 2025 11:51
por mauricioportela
Codigo modificado anexo.