Ainda aprendendo Python...

Fórum sobre outras linguagens de programação.

Moderador: Moderadores

toya
Usuário Nível 3
Usuário Nível 3
Mensagens: 157
Registrado em: 26 Jul 2004 16:51
Localização: Campo Grande/MS - Brasil
Contato:

Ainda aprendendo Python...

Mensagem 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)



Elcio Carlos
(toya)
Ahora en la version 6.5
toyasis@gmail.com (e-mail)
toyaskype (skype)
http://www.toyanet.com.br
https://www.facebook.com/profile.php?id=100009195956044

FWH 11.8+PellesC+xHarbour.org 1.2.1+SqlRDD
Clippeiro por opção, Fivewiner por amor ao Clipper...
2015 - Iniciante/Aprendiz de HMG...
Avatar do usuário
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Ainda aprendendo Python...

Mensagem 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
Avatar do usuário
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Ainda aprendendo Python...

Mensagem por mauricioportela »

Codigo modificado anexo.
Anexos
codigo_modificado_com_interface.py.txt
(4.04 KiB) Baixado 54 vezes
codigo_modificado.py.txt
(2.13 KiB) Baixado 59 vezes
Responder