Suponha que anda à procura num ficheiro de texto de um dado
padrão. Como resolver o problema? Se pensar um pouco chegará à conclusão que vai ter que ler o ficheiro e analisar a cadeia de caracteres para determinar se o padrão o corre ou não. Podemos ler o ficheiro todo de uma vez, linha a linha ou todas as linhas (neste caso na forma de uma lista de linhas). Vejamos as diferentes soluções:
01.
def
wally_0(ficheiro,padrao):
02.
03.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
04.
texto
=
f_ent.read()
05.
if
padrao
in
texto:
06.
return
True
07.
return
False
08.
09.
10.
11.
def
wally_1(ficheiro,padrao):
12.
13.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
14.
for
linha
in
f_ent:
15.
if
padrao
in
linha:
16.
return
True
17.
return
False
18.
19.
20.
def
wally_11(ficheiro,padrao):
21.
22.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
23.
texto
=
f_ent.readlines()
24.
for
linha
in
texto:
25.
if
padrao
in
linha:
26.
return
True
27.
return
False
Suponhamos agora que a pergunta muda ligeiramente, e nos pedem para dizer não apenas se o padrão existe, mas também
em que linha existe. Uma vez mais, uma breve reflexão leva-nos a concluir que ler todo o ficheiro de uma só vez não é agora adequado. Também ler todas as linhas não nos parece a melhor ideia: afinal mal encontremos o padrão podemos abandonar o programa e não precisamos de guardar na memória todos as linhas do ficheiro, que podem ser em número muito elevado. Como fazer? Essa uma resposta.
1.
def
wally_2(ficheiro,padrao):
2.
3.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
4.
for
i,linha
in
enumerate(f_ent):
5.
if
padrao
in
linha:
6.
return
i
+
1
7.
return
-
1
como se observa no código acima, usamos a função
enumerate para nos resolver a dificuldade de ler as linhas e saber o seu número. E se agora nos disserem que se pretendem as linhas de
todas as ocorrências? Hum,…, para isso precisamos de um
contentor onde guardar a informação que vamos recolhendo por análise do ficheiro linha a linha.
1.
def
wally_3(ficheiro,padrao):
2.
3.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
4.
num_lin
=
[]
5.
for
i,linha
in
enumerate(f_ent):
6.
if
padrao
in
linha:
7.
num_lin.append(i
+
1
)
8.
return
num_lin
Não param de mudar o que nos pedem: passou a ser a linha e a
posição dentro da linha. Para resolver lá nos temos que socorrer dos métodos conhecidos sobre cadeias de caracteres:
1.
def
wally_4(ficheiro,padrao):
2.
3.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
4.
for
i,linha
in
enumerate(f_ent):
5.
pos
=
linha.find(padrao)
6.
if
pos !
=
-
1
:
7.
return
i
+
1
,pos
8.
return
-
1
,
-
1
Como se pode ver o método
find foi a nossa salvação. E este problema ainda mas para
todas as ocorrências?
01.
def
wally_5(ficheiro,padrao):
02.
03.
with open(ficheiro,
'r'
,encoding
=
'utf-8'
) as f_ent:
04.
num_pos_lin
=
[]
05.
for
i,linha
in
enumerate(f_ent):
06.
pos
=
linha.find(padrao)
07.
if
pos !
=
-
1
:
08.
num_pos_lin.append((i
+
1
,pos))
09.
return
num_pos_lin
E se …. A sua imaginação é o limite. Tente perceber as alternativas e o modo como ficheiros, cadeias de caracteres e listas estão ligados entre si.
Sem comentários:
Enviar um comentário