How to avoid calling the same function several times?

Asked

Viewed 120 times

2

I have two scripts files, one to access a CSV file, turn each row into a dictionary and return 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 one (C1) and delete the old column (C2). The purpose of this is to change the name of columns in the CSV file by creating copies with different names, but to change these I must call the same function several times only by 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: acessar_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 as in the following question, but I could not: Error: unhashable type: dict_keys, how to resolve?

Thank you!

1 answer

1


  1. Create a dictionary with all the Keys (English words) and their respective values (Portuguese words).

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()
  1. Change the parameters of the function to change its name so that it only receives the name of the file. In the body of the function make a loop reading each of the columns and looking in the dictionary if match with some key, if yes then changes in the file that column to the value in English, if it does not follow the loop until the end of the file.

# 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))
  1. 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))
  • Hi, sorry to ask, this may sound silly but I’m new to programming. This is more or less what I tried to do in this code: https://answall.com/questions/258274/erro-unhashable-type-dict-keys-howto resolve/ ? If yes, what should I change?

  • If it looks like this, it can show the first five lines of the CSV file?

  • Hello, of course! I got the top 10: https://imgur.com/a/Lssx0 This is the wrapped file

  • Cristhian Miguel, here is the code that translates the columns of the CSV file, now just put in methods as you need, or turn into a script that you call from the command line and pass parameters. It all depends on the need. I hope I helped. Hug.

  • Thank you very much, really helped!

  • I’m glad it worked. Don’t forget to upvote on the answer. Hug.

  • Of course, it’s done!

  • I also added the code to Github for future references. https://github.com/klebercsilva/csv_headers_translator

Show 3 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.