Ainda aprendendo Python...
Enviado: 21 Jun 2025 14:12
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#
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)