Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ex-dead

Dúvida compilar/executar

Recommended Posts

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.

Edited by pwseo
GeSHi

Share this post


Link to post
Share on other 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
   # ...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.