Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ex-dead

Dúvida compilar/executar

Mensagens Recomendadas

ex-dead

Boas.

Sou novo nisto de python e gostava que me esclarecessem umas coisas.

Tenho este programa me faz a média de valores q estão num ficheiro de texto (ou pelo menos espero eu):

import sys

ler=sys.stdin.readline()

def media(arg):
   val=0.0
   conta=0
   for s in arg:
       val+=float(s)
       conta+=1
   print ("%.2f" %(val / conta))

media(ler)

Ao compilar estou a fazer "python3 ex.py <teste.txt" (o ficheiro teste.txt tem linhas com varios valores inteiros)

Dá me este erro:

File "ex.py", line 12, in <module>
   media(ler)
 File "ex.py", line 8, in media
   val+=float(s)
ValueError: could not convert string to float:

Achei que pudesse ser por ter valores separados por espaços ou '\n' mas mesmo com um só valor dá o mesmo erro.

Não sei se o erro está no programa ou se será por estar a compilar por um ficheiro de texto.

Obrigado.

Editado por pwseo
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

ex-dead,

O ficheiro que estás a tentar ler tem apenas um número por linha ou pode ter vários? É importante saber a resposta a esta questão, mas vou assumir que sim no resto da minha resposta. Se não for o caso, cá estaremos para te ajudar na mesma.

De qualquer modo, o problema que estás a ter reside no simples facto de que readline lê apenas uma linha de texto. Por esse motivo, se eu introduzir o número 42, a variável ler será a string "42\n" (sendo que \n corresponde à tecla ENTER).

Ora, quando no ciclo fazes for s in arg, cada iteração corresponderá a um carácter e não a uma linha, ou seja, 4, 2 e \n. Consegues verificar o que eu disse se experimentares colocar a seguinte linha no ciclo:

for s in arg:
   print('s = "{}"'.format(s))
   val += float(s)
   ...

A execução revelará:

~ $ python3 exdead.py
42
s = "4"
s = "2"
s = "
"
Traceback (most recent call last):
 File "exdead.py", line 14, in <module>
   media(ler)
 File "exdead.py", line 10, in media
   val += float(s)
ValueError: could not convert string to float:

Agora presta atenção às linhas:

s = "
"

O que está entre as aspas é o \n (o ENTER, como disse há pouco). O teu código falha quando tenta converter esse carácter para um float, como seria de esperar.

Posto isto, aqui fica, de forma simples, como ler um ficheiro uma linha de cada vez:

import sys

for linha in sys.stdin:
   linha = linha.strip()  # remover os espaços antes e depois (e também o \n)

   # e agora fazes o que quiseres com a linha
   # ...

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.