How do I avoid calling the same function multiple times?

2

I have two script files, one for accessing a CSV file, turning each line into a dictionary, and returning a list of dictionaries (lines).

My second script is a function to create a new column in the file (C1), copy the data from another column (C2) to this new (C1) and delete the old column (C2). The purpose of this is to change the column names in the CSV file by creating copies with different names, however to change these I must call the same function several times just changing the parameters that are the old and new names used. How can I do this without having to call the function all the time?

File 1: access_csv

import unicodecsv


def ler_csv(arquivo):
    with open(arquivo, 'rb') as dados:
        dicionario = unicodecsv.DictReader(dados)
        return list(dicionario)

inscricoes = ler_csv('inscriçoes.csv')
envolvimento_diario = ler_csv('envolvimento_diario.csv')
submissoes_de_projetos = ler_csv('submissoes_de_projetos.csv')

File 2: change_name

from acessar_csv import envolvimento_diario, inscricoes, submissoes_de_projetos


# Alterar nome das colunas de inglês para português

def alterar_nome(arquivo, colunaIngles, colunaPortugues): # Função para alterar nome das colunas, recebendo como argumentos o arquivo que será alterado, o nome da coluna em Inglês (atual) e o novo nome em português
    for coluna in arquivo:
        coluna[colunaPortugues] = coluna[colunaIngles] # Cria uma nova coluna (colunaPortugues) cujos valores são iguais ao da colunaIngles
        del[coluna[colunaIngles]] # Deleta a colunaIngles


# Chamada de função para alterar o nome das colunas do arquivo envolvimento_diario

alterar_nome(envolvimento_diario, 'acct', 'id_conta')
alterar_nome(envolvimento_diario, 'utc_date', 'data_coleta_dados')
alterar_nome(envolvimento_diario, 'num_courses_visited', 'num_cursos_visitados')
alterar_nome(envolvimento_diario, 'total_minutes_visited', 'total_minutos_visitados')
alterar_nome(envolvimento_diario, 'lessons_completed', 'lições_completadas')
alterar_nome(envolvimento_diario, 'projects_completed', 'projetos_completos')

# Chamada de função para alterar o nome das colunas do arquivo inscricoes

alterar_nome(inscricoes, 'account_key', 'id_conta')
alterar_nome(inscricoes, 'status', 'status_inscrição')
alterar_nome(inscricoes, 'join_date', 'data_inscrição_curso')
alterar_nome(inscricoes, 'cancel_date', 'data_cancelamento_inscrição')
alterar_nome(inscricoes, 'days_to_cancel', 'dias_até_cancelamento')
alterar_nome(inscricoes, 'is_udacity', 'conta_teste')
alterar_nome(inscricoes, 'is_canceled', 'cancelamento_data_coleta_dados')

# Chamada de função para alterar o nome das colunas do arquivo submissoes_de_projetos

alterar_nome(submissoes_de_projetos, 'creation_date', 'data_submissão_projeto')
alterar_nome(submissoes_de_projetos, 'completion_date', 'data_avaliação_projeto')
alterar_nome(submissoes_de_projetos, 'assigned_rating', 'status_avaliação_projeto')
alterar_nome(submissoes_de_projetos, 'account_key', 'id_conta')
alterar_nome(submissoes_de_projetos, 'lesson_key', 'id_projeto')
alterar_nome(submissoes_de_projetos, 'processing_state', 'status_processo_avaliação')

print (envolvimento_diario[0])
print (inscricoes[0])
print (submissoes_de_projetos[0])

I tried to do this with a dictionary like the following question, but I could not: Error: unhashable type: 'dict_keys', how to solve?

Thank you!

    
asked by anonymous 28.11.2017 / 03:57

1 answer

1
  • Create a dictionary with all the keys and their values.
  • import csv

    # Caminho do arquivo CSV que será manipulado
    csv_file = "ARQUIVO_CSV.csv"
    
    # Dicionário contendo as traduções de inglês para português
    # TODO: Armazenar os dados abaixo em um arquivo externo ou banco de dados
    traducoes = {'acct': 'id_conta', 
                 'utc_date':'data_coleta_dados',
                 'num_courses_visited': 'num_cursos_visitados'}
    
    # Lista para armazenar os nomes das colunas do arquivo CSV
    csv_data = list()
    
  • Change the parameters of the change_name function so that it receives only the file name. In the body of the function, loop through each of the columns and search the dictionary if you match with a key, if yes then change that column to the Portuguese value if you do not follow the loop to the end of the file. li>

    # Abre o arquivo CSV como somente leitura e faz um loop nas colunas da linha 1 do arquivo CSV (Cabeçalho) verificando se existe uma palavra em português correspondente no dicionário definido acima e adiciona na lista csv_data. No final do processo a lista csv_data terá as palavras traduzidas e as que não forem encontradas serão adicionadas na sua versão em inglês

    with open(csv_file, 'r') as f:
        reader = csv.reader(f)
        csv_data.clear()
        # Just a cool way to represent the first line of the file
        header = 1
        try:
            for row in reader:
                if reader.line_num == header:
                    for column in row:
                        if column.strip() in traducoes.keys():
                            csv_data.append(traducoes.get(column.strip()))
                else:
                    csv_data.append(column.strip())
        f.close()
        except csv.Error as e:
            f.close()
            sys.exit('Erro durante a leitura do arquivo %s, na linha %d: %s' % (filename, reader.line_num, e))
    
  • Opens the original CSV file this time as written and changes the headers in English to Portuguese according to what was filled in the csv_data list:
  • # Abre o arquivo CSV como escrita e escreve nas colunas do arquivo o conteúdo generado na lista csv_data

    with open(csv_file, 'w') as f:
        delimiter = ", "
        col_count = 1
        try:
            for data in csv_data:
                if col_count < len(csv_data):
                    f.write(data + delimiter)
                else:
                    f.write(data)
                col_count += 1
        f.close()
        except IOError as ioe:
            f.close()
            sys.exit('Erro durante a escrita do arquivo %s, %s' % (filename, ioe))
    
        
    28.11.2017 / 05:51