Ir para o conteúdo
Guest Shad07

[Resolvido] Escrever e ler ficheiros CSV

Mensagens Recomendadas

Guest Shad07

Oi tenho que fazer duas funções uma delas comecei e a outra não sei com fazer... :

Uma das funções media_idades(nome_ficheiro_animais, nome_ficheiro_donos, nome_ficheiro_medias) , recebe três nomes de ficheiros e não

devolve nada. A função deve ler os dados sobre os animais do ficheiro CSVcorrespondente ao primeiro parâmetro, os dados sobre os donos do ficheiro CSV correspondente ao segundo parâmetro, e escrever no ficheiro correspondente ao terceiro parâmetro os dados das médias de idades.

A função media_idades deve recorrer a uma outra que efectua o cálculo das médias. Mais precisamente, deverá escrever uma função

calcula_media(tabela_animais, tabela_donos) que recebe uma tabela com a informação relativa aos animais e outra com a informação dos donos e produz uma nova tabela como os dados relativos à média das idades. Por tabela entendemos uma lista de dicionários, todos com os mesmos campos.

Os dicionários dos animais deverão conter três campos ( 'Nome do animal' , 'Especie' e 'Idade' ), o dos donos dois ( 'Nome do dono' e

'Nome do animal' ) e os dicionários na tabela resultante deverão também conter dois campos ( 'Nome do dono' e 'Media das idades' ). A média das idades deve aparecer arredondada às unidades.

Exemplos de 2 ficheiros csv quando abertos numa folha de cálculo:

2c20c0f436364d3bde8f2103a257f6b4.png

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Pedia-te que reformulasses o tópico de maneira a não ser um mero «copy-paste» do enunciado que tens que resolver. Estamos aqui para te ajudar a resolver os problemas que encontras, e não para ler o enunciado por ti (se precisarmos dele, dir-te-emos isso mesmo).

Posto isto, o que fizeste até agora? Que dúvidas tens especificamente? (não chega dizer «uma delas comecei e a outra não sei como fazer»).

Aguardo então que procedas às alterações pedidas para que possamos seguir em frente.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

Eu até agora tenho isto da primeira função:

with open(nome_ficheiro_animais, 'rU') as ficheiro_csv:
leitor = csv.reader(ficheiro_csv, delimiter = ';')

agora segundo o que é pedido no enunciado tenho que ler o ficheiro do segundo parâmetro também, mas não sei como...

e queria experimentar a função só que para tal tenho que ter o terceiro ficheiro que é o que é suposto ser criado na segunda função pelo que percebi..

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Tinha dito para reformulares o post de abertura do tópico, pelo menos para que não fique apenas um «copy-paste» do enunciado. No futuro este tipo de posts serão ocultados, pois vão contra o espírito do fórum.

Um reparo: quando colocas código aqui no fórum, deves fazer de forma a que o mesmo seja colorido: aqui tens como fazer isso.

Relativamente ao teu problema: tens que fazer uma coisa de cada vez, logicamente. Primeiro tens que ler o primeiro ficheiro e construir a estrutura de dados que te é pedida. De seguida, tens que ler o segundo ficheiro e construir a outra estrutura de dados que te é pedida.

De seguida, tens que construir a estrutura de dados que será escrita no terceiro ficheiro e aí sim, escrevê-la.

Algo assim (só tens que completar):

def media_idades(nome_ficheiro_animais, nome_ficheiro_donos, nome_ficheiro_medias):
   # ler o primeiro ficheiro e construir a primeira estrutura de dados
   with open(nome_ficheiro_animais) as f1:
       leitor = csv.reader(f1, delimiter = ';')
       ...

   # ler o segundo ficheiro e construir a segunda estrutura de dados
   with open(nome_ficheiro_donos) as f2:
       leitor = csv.reader(f2, delimiter = ';')
       ...

   # construir a estrutura de dados para o terceiro ficheiro
   ...

   # escrever no terceiro ficheiro
   with open(nome_ficheiro_medias, 'w') as f3:
       writer = csv.writer(f3, delimiter = ';')

       # aqui terias um ciclo para cada linha da tua estrutura, utilizando a função writerow()
       ...

PS.: Já agora, quem desenvolveu este enunciado? As estruturas de dados que vos obrigam a criar são muito pouco eficientes...

Editado por pwseo
Adicionado post scriptum

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

pwseo

Para ler os ficheiros dos 2 primeiros parâmetros da função media_idades basta isto? :

   with open(nome_ficheiro_animais, 'rU') as ficheiro_csv_animais:
               leitor = csv.reader(ficheiro_csv_animais, delimiter = ';')


       with open(nome_ficheiro_donos, 'rU') as ficheiro_csv_donos:
               leitor = csv.reader(ficheiro_csv_donos, delimiter = ';')

Ou é necessário fazer algo deste género:

def leitura_csv:

resultado = []
       with open(nome_ficheiro, 'rU') as ficheiro_csv:
               leitor = csv.reader(ficheiro_csv, delimiter = ';')
               for linha in leitor:
                       resultado.append(linha)
       return resultado

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Tem atenção ao seguinte:

  • Quando defines uma função, tens que acrescentar () ao final do seu nome:
    # Portanto, isto está errado:
    def leitura_csv:
    # O correcto seria assim:
    def leitura_csv():
    


  • Se consultares a documentação do módulo csv, verás que é necessário utilizar um ciclo para ler todas as linhas do ficheiro CSV, como mostraste no 2º exemplo de código

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07
def leitura_csv(nome_ficheiro_animais, nome_ficheiro_donos, nome_ficheiro_medias):
 with open(nome_ficheiro_animais, 'rU') as ficheiro_csv_animais:
	 resultado = []
	 leitor = csv.reader(ficheiro_csv_animais, delimiter = ';')
	 for linha in leitor:
			  resultado.append(linha)
	 return resultado
 with open(nome_ficheiro_donos, 'rU') as ficheiro_csv_donos:
	 resultado = []

	 leitor = csv.reader(ficheiro_csv_donos, delimiter = ';')
	 for linha in leitor:
			   resultado.append(linha)
	  return resultado
 with open(nome_ficheiro_medias, 'w') as ficheiro_csv_medias:
   writer = csv.writer(ficheiro_csv_medias, delimiter = ';')
	 (aqui agora é que ainda não sei como fazer)

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

A tua função nunca vai funcionar como pretendes: quando fazes return variavel, a função é terminada nesse preciso momento e devolve variavel à função que a chamou. No teu caso, verias apenas o resultado da leitura do ficheiro dos animais.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

O objetivo é ler os 2 primeiros ficheiros sem devolver nada e depois sim produzir um terceiro ficheiro que é o do terceiro parâmetro

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

O objetivo é ler os 2 primeiros ficheiros sem devolver nada e depois sim produzir um terceiro ficheiro que é o do terceiro parâmetro

Sim, eu sei isso. Relê o que te disse no post anterior, pois não compreendeste o que te disse.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

Sim, eu sei isso. Relê o que te disse no post anterior, pois não compreendeste o que te disse.

Ok acho que já percebi,

Assim que a função realiza o primeiro return termina, e devolve o resultado na variavel resultado.

Mas sendo assim, o que posso fazer para que a função leia os primeiros dois ficheiros e escreva o segundo sem terminar assim que lê o primeiro ficheiro?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Tal como é indicado no enunciado, tens que ler o conteúdo do primeiro ficheiro para uma «tabela», o conteúdo do segundo ficheiro para outra «tabela», e depois construir uma terceira «tabela» a partir das duas primeiras. É esta última que devolves.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

def leitura_csv(nome_ficheiro_animais, nome_ficheiro_donos, nome_ficheiro_medias):
with open(nome_ficheiro_animais, 'rU') as ficheiro_csv_animais:
 tabela_animais = []
	 leitor = csv.reader(ficheiro_csv_animais, delimiter = ';')
	 for linha in leitor:
	 tabela_animais.append(linha)
with open(nome_ficheiro_donos, 'rU') as ficheiro_csv_donos:
 tabela_donos = []

	 leitor = csv.reader(ficheiro_csv_donos, delimiter = ';')
	 for linha in leitor:
	 tabela_donos.append(linha)
with open(nome_ficheiro_medias, 'w') as ficheiro_csv_medias:
	 writer = csv.writer(ficheiro_csv_medias, delimiter = ';')
	 (aqui agora é que ainda não sei como fazer)

assim?

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

assim ?

Pensa bem no que fizeste. Quando chegares ao ponto onde tens que criar a terceira «tabela», onde está a tabela dos animais e a dos donos? Tens acesso a ambas? Como te disse, pensa bem. Relê o código e testa-o. Vocês testam pouco o que escrevem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

a tabela dos animais e dos donos seria depois chamada quando fosse criada a terceira tabela

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Mantenho o que disse.

Relê o código e testa-o. Vocês testam pouco o que escrevem.

Dica: estás a utilizar a mesma variável para ambas as tabelas.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

Óptimo.

Se tudo estiver a correr bem, terás agora que construir a tal terceira tabela. Outra pessoa no fórum já tentou resolver o mesmo problema, pelo que recomendo que leias a respectiva thread: http://www.portugal-a-programar.pt/topic/73334-lista-de-dicionarios/.

Preciso de fazer return da tabela_animais e da tabela_donos ?

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Tens que trabalhar com a tabela_animais e tabela_donos para construir uma terceira tabela. Essa terceira tabela é que vai ter que ser devolvida, via return. Relê bem o problema e depois escreve o código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

Shad07,

Tens que trabalhar com a tabela_animais e tabela_donos para construir uma terceira tabela. Essa terceira tabela é que vai ter que ser devolvida, via return. Relê bem o problema e depois escreve o código.

Ok, pwseo

Mas antes de começar essa terceira tabela, tenho que fazer primeiro a função que calcula a média, certo ?

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

oi pwseo,

será que podias dar uma ajuda na função para calcular a média das idades ? já tenho um pouco de código mas não sei se o que tenho está correto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

será que podias dar uma ajuda na função para calcular a média das idades ? já tenho um pouco de código mas não sei se o que tenho está correto

Se explicares quais são as tuas dúvidas podemos ajudar (não apenas eu, mas todos os participantes deste quadro).

Se alguma dúvida for relacionada com o código, tens logicamente que mostrar o código relevante.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.