Jump to content
alves077

[Dúvida] Scanf python

Recommended Posts

alves077

Boa noite,

Sou iniciado em python, alguém me sabe dar uma ideia como leio um input até EOF em python com scanf? Com o scanf ou com qualquer função equivalente. Já fiz algumas experiencia mas não correram muito bem..

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
thoga31

Até EOF? Isso é de um ficheiro.

Explica melhor o que pretendes. Não estou a perceber a ideia de "ler até EOF".

E não existe um scanf em Python.


Knowledge is free!

Share this post


Link to post
Share on other sites
Pedro C.

End Of File (EOF). É possível e muito utilizado se não encontrares uma função de alto nível que o faça automáticamente. Também o scanf (estou a assumir o paralelo com o scanf do C++) pode ser feito (de maneira mais simples que o C).

Dado que essa é uma pergunta muito recorrente nos foruns a resposta aparece muitas vezes. Vou seguir o exemplo deste:

linha = []	  # Estou a declarar uma lista vazia
with open('caminho_do_ficheiro.ext') as ficheiro:   # Estou a abrir uma variável (classe) de ficheiro
 for linha in ficheiro:	 # Este é um ciclo para fazer o loop sobre todas as linhas de ficheiro.
	  a.append(linha)	   # Estou a acrescentar a linha (literalmente toda a informação dessa linha) à minha lista

Com este código ficarias com um objecto lista (é como um array em C mas mais flexivel pois pode guardar informações de vários tipos no mesmo array alem de ter funções de pop, remove, etc.; ah, é também bastante mais pesado na memória portanto se o teu ficheiro for extenso avisa pois convem ter outro tipo de soluções). Cada posição da lista é uma string com tudo o que está nessa linha.

Agora é importante perceber como funcionam os ciclos em Python. O ciclo "for" é diferente do "while", por exemplo. Repara neste seguinte exemplo:

lista = ['a','b','c','d','e'] # lista com strings de letras
for i in lista:   # ciclo que tem uma variável "i" que não é um contador mas sim o próprio elemento da lista.
print i	# fazer o print (cout) para ver o que é o "i".

O resultado do "print i" seria:

a
b
c
d
e

Isto implica que o "i" é na verdade o equivalente ao "lista" se o "i" fosse um contador (que não é...). Para usar um "for" com contador teriamos de fazer:

for i in xrange(10): # o 10 é só para exemplo
 print i

Este código faria print de numeros de 0 até 9 (o limite superior não pertence à contagem). Ou então utilizar o mais que comum ciclo "while":

i=0
while i<10:
 print i
 i = i + 1

Isto tudo para se perceber como o código deste post está a funcionar. Outros comandos que te possam interessar são conversões de string (o que vai esta na lista são strings) para números.

Para fazer a conversão de uma string de inteiro para um inteiro utiliza o comando "int" ( int(linha) ). Isto se apenas houver um inteiro por linha.

Para doubles (float em Python) farias float(linha). E o mesmo para qualquer outro tipo de dados.

Se tiveres mais um número por linha tens de fazer uma lista de listas onde a cada linha farias isto: linha.split(' ') (estou a separar uma string numa lista de strings separadas por whitespace),

e depois converteres cada um individualmente.

Se saires do Python nativo estas operações já estão feitas automaticamente em inúmeras bibliotecas (ver: http://www.numpy.org/). Qualquer dúvida avisa.

Share this post


Link to post
Share on other sites
alves077

Boas,

thoga31 o que queria dizer, se calhar não expliquei lá muito bem, fazendo a analogia com C, posso fazer um input até uma linha em branco por exemplo.

Em C podia fazer um ciclo que percorre-se as linhas preenchidas até EOF. Sendo ficheiro ou não, por exemplo podia chegar a linha de comandos e com o executável de um ficheiro fazer teste > teste.txt. Onde o ficheiro teste.txt têm casos de input para o programa em C em questão. Basicamente é um input para o programa até uma linha em branco, até não encontrar mais nada, por isso chamei pelo EOF.

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
thoga31

Não sei se entendi bem o que queres, mas para ler o conteúdo de um ficheiro tens isto:

f = open("directório", "r")
# se já abriste o ficheiro e fizeste coisas com ele, tens de voltar ao início:
f.seek(0)
conteudo = [line[:-1] for line in f.readlines()]


Knowledge is free!

Share this post


Link to post
Share on other sites
alves077

Acho que com um exemplo explico melhor. Por exemplo quero ler uma sequencia do tipo

1 2

3 4

5 6

7 8

Até ele deixar uma linha em branco.

Share this post


Link to post
Share on other sites
thoga31

Acho que com um exemplo explico melhor. Por exemplo quero ler uma sequencia do tipo

1 2

3 4

5 6

7 8

Até ele deixar uma linha em branco.

Para facilitar a interpretação da tua última frase, podias dizer qual ser o resultado da leitura. De repente vejo duas leituras possíveis: lia apenas "1 2" ou lia tudo até ao fim, altura em que encontrava uma linha desprovida de conteúdo.

Para quem está do lado de lá as coisas parecem simples e bem explicadas, mas o problema é que do lado de cá a cabeça não é a mesma e a sua actividade não é a mesma, e podem-se gerar várias interpretações, todas elas fundamentadas.


Knowledge is free!

Share this post


Link to post
Share on other sites
alves077

Tens razão, tenho explicado um bocado mal...

O que o programa têm que fazer é simples, verificar sempre qual a diferença entre no número da coluna da esquerda com o número da coluna da direita.

O que queria é que ele inseri-se a primeira linha e eu dentro de um ciclo lê-se o input tratando essa linha e desse logo o ouput e assim sucessivamente. E o programa acabava com uma linha em branco. Por exemplo

1 2

<

3 4

<

5 6

<

7 8

<

(linha em branco)

E acaba-se. Os simbolos é o output do programa e os números são o input.

Obrigado pela atenção,

alves077

Edited by alves077

Share this post


Link to post
Share on other sites
thoga31

Isto para começar, a partir daqui deverás ser capaz de terminar.

s="1 2\n3 4\n5 6\n7 8"
linhas = s.split("\n")
# linhas = ["1 2", "3 4", "5 6", "7 8"]


Knowledge is free!

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

×
×
  • Create New...

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.