3. O básico
3.1. Um exemplo de um programa em Python
Segue-se um programa que demonstra as funcionalidades básicas do Python.
O programa (bases_01)
| # -*- coding=utf-8 -*-
# ----------------------------------
def affiche(chaine):
# chain poster
print "chaine=%s" % (chaine)
# ----------------------------------
def afficheType(variable):
# displays variable type
print "type[%s]=%s" % (variable,type(variable))
# ----------------------------------
def f1(param):
# add 10 to param
return param+10
# ----------------------------------
def f2():
# returns 3 values
return ("un",0,100);
# -------------------------------- main program ------------------------------------
# this is a comment
# variable used without being declared
nom="dupont"
# a screen display
print "nom=%s" % (nom)
# a list with elements of different types
liste=["un","deux",3,4]
# its number of elements
n=len(liste)
# a loop
for i in range(n):
print "liste[%d]=%s" % (i,liste[i])
# initialize 2 variables with a tuple
(chaine1,chaine2)=("chaine1","chaine2")
# concatenation of the 2 strings
chaine3=chaine1+chaine2
# result display
print "[%s,%s,%s]" % (chaine1,chaine2,chaine3)
# use function
affiche(chaine1)
# the type of a variable can be known
afficheType(n)
afficheType(chaine1)
afficheType(liste)
# the type of a variable can change at runtime
n="a change"
afficheType(n)
# a function can return a result
res1=f1(4)
print "res1=%s" % (res1)
# a function can return a list of values
(res1,res2,res3)=f2()
print "(res1,res2,res3)=[%s,%s,%s]" % (res1,res2,res3)
# we could have retrieved these values in a
liste=f2()
for i in range(len(liste)):
print "liste[%s]=%s" % (i, liste[i])
# testing
for i in range(len(liste)):
# displays only channels
if (type(liste[i])=="str"):
print "liste[%s]=%s" % (i,liste[i])
# other tests
for i in range(len(liste)):
# displays only integers >10
if (type(liste[i])=="int" and liste[i]>10):
print "liste[%s]=%s" % (i,liste[i])
# a while loop
liste=(8,5,0,-2,3,4)
i=0
somme=0
while(i<len(liste) and liste[i]>0):
print "liste[%s]=%s" % (i,liste[i])
somme+=liste[i] # sum=sum+t[i]
i+=1 # i=i+1
print "somme=%s" % (somme)
# end of program
|
Nota:
- linha 1: um comentário especial utilizado para declarar o tipo de codificação do script, neste caso UTF-8. Isto depende do editor de texto utilizado. Aqui, com o Notepad++:
 | |
- linha 4: a palavra-chave
def define uma função;
- linhas 5-6: o corpo da função. Está recuado uma tabulação para a direita. Este recuo, combinado com os dois pontos (:) na instrução
def, define o corpo da função. Isto aplica-se a todas as instruções com um corpo: if, else, while, for, try, except;
- linha 12: o Python gere os tipos de variáveis internamente. Pode determinar o tipo de uma variável utilizando a função
type(variable)*, que devolve uma variável do tipo 'type'. A expressão '%s' % (type(variable))* é uma cadeia de caracteres que representa o tipo da variável;
- linha 25: o programa principal. Este surge após a definição de todas as funções do script. O seu conteúdo não está indentado;
- Linha 28: Em Python, não se declaram variáveis. O Python distingue maiúsculas de minúsculas. A variável
Nom é diferente da variável nom*. Uma cadeia de caracteres pode ser colocada entre aspas duplas " ou aspas simples '. Assim, pode escrever 'dupont' ou "dupont*";
- linha 31: a expressão "xxxx%syyyy%szzzz" % (100, 200) é a string "xxxx100yyy200szzzz", onde cada %s foi substituído por um elemento da tupla. %s é o especificador de formatação de string. Existem outros formatos;
- linha 34: há uma diferença entre uma tupla (1,2,3) (repare nos parênteses) e uma lista [1,2,3] (repare nos colchetes). A tupla é imutável, enquanto a lista é mutável. Em ambos os casos, o elemento número i é denotado por [i];
- linha 40: range(n) é a tupla (0,1,2,...,n-1);
- linha 74: len(var) é o número de elementos na coleção var (tupla, lista, dicionário, ...);
- linha 86: os outros operadores booleanos são or e not.
A saída no ecrã é a seguinte:
| nom=dupont
liste[0]=un
liste[1]=deux
liste[2]=3
liste[3]=4
[chaine1,chaine2,chaine1chaine2]
chaine=chaine1
type[4]=<type 'int'>
type[chaine1]=<type 'str'>
type[['un', 'deux', 3, 4]]=<type 'list'>
type[a change]=<type 'str'>
res1=14
(res1,res2,res3)=[un,0,100]
liste[0]=un
liste[1]=0
liste[2]=100
liste[0]=8
liste[1]=5
somme=13
|
3.2. Conversões de tipos
Aqui, focamo-nos nas conversões de tipos que envolvem dados dos tipos str (string), int (inteiro), float (ponto flutuante) e bool (booleano).
O programa (bases_01b)
| # -*- coding=utf-8 -*-
# type changes
# int --> str, float, bool
x=4
print x, type(x)
x=str(4)
print x, type(x)
x=float(4)
print x, type(x)
x=bool(4)
print x, type(x)
# bool --> int, float, str
x=True
print x, type(x)
x=int(True)
print x, type(x)
x=float(True)
print x, type(x)
x=str(True)
print x, type(x)
# str --> int, float, bool
x="4"
print x, type(x)
x=int("4")
print x, type(x)
x=float("4")
print x, type(x)
x=bool("4")
print x, type(x)
# float --> str, int, bool
x=4.32
print x, type(x)
x=str(4.32)
print x, type(x)
x=int(4.32)
print x, type(x)
x=bool(4.32)
print x, type(x)
# type change error handling
try:
x=int("abc")
print x, type(x)
except ValueError, erreur:
print erreur
# various Boolean cases
x=bool("abc")
print x, type(x)
x=bool("")
print x, type(x)
x=bool(0)
print x, type(x)
x=None
print x, type(x)
x=bool(None)
print x, type(x)
|
São possíveis muitas conversões de tipo. Algumas podem falhar, como as das linhas 45–49, que tentam converter a cadeia de caracteres 'abc' num inteiro. Tratámos o erro utilizando um bloco try/except. A forma geral deste bloco é a seguinte:
try:
actions
except Exception, Message:
actions
finally:
actions
Se alguma das ações dentro do bloco try lançar uma exceção (sinalizar um erro), o controlo passa imediatamente para a cláusula **except. Se as ações dentro do bloco try não lançarem uma exceção, a cláusula except é ignorada. Os atributos Exception e Message da instrução except são opcionais. Quando presentes, Exception especifica o tipo de exceção capturada pela instrução except, e Message contém a mensagem de erro associada à exceção. Podem existir várias instruções except se pretender tratar diferentes tipos de exceções dentro do mesmo bloco try.
A instrução finally é opcional. Se estiver presente, as ações no bloco finally* são sempre executadas, independentemente de ter ocorrido ou não uma exceção*.
Voltaremos às exceções um pouco mais tarde.
As linhas 52–61 mostram várias tentativas de converter dados dos tipos str, int, float e NoneType para boolean. Isso é sempre possível. As regras são as seguintes:
- bool(int i) é False se i for 0, True em todos os outros casos;
- bool(float f) é False se f for 0.0, True em todos os outros casos;
- bool(str string) é False se string tiver 0 caracteres, True em todos os outros casos;
- bool(None) é False. None é um valor especial que significa que a variável existe, mas não tem valor.
A saída no ecrã é a seguinte:
| 4 <type 'int'>
4 <type 'str'>
4.0 <type 'float'>
True <type 'bool'>
True <type 'bool'>
1 <type 'int'>
1.0 <type 'float'>
True <type 'str'>
4 <type 'str'>
4 <type 'int'>
4.0 <type 'float'>
True <type 'bool'>
4.32 <type 'float'>
4.32 <type 'str'>
4 <type 'int'>
True <type 'bool'>
invalid literal for int() with base 10: 'abc'
True <type 'bool'>
False <type 'bool'>
False <type 'bool'>
None <type 'NoneType'>
False <type 'bool'>
False <type 'bool'>
|
3.3. O âmbito das variáveis
Programa (bases_02)
| # -*- coding=utf-8 -*-
# variable scope
def f1():
# we use the global variable i
global i
i+=1
j=10
print "f1[i,j]=[%s,%s]" % (i,j)
def f2():
# we use the global variable i
global i
i+=1
j=20
print "f2[i,j]=[%s,%s]" % (i,j)
def f3():
# we use a local variable i
i=1
j=30
print "f3[i,j]=[%s,%s]" % (i,j)
# tests
i=0
j=0 # these two variables are known only to a function f
# only if it explicitly declares with the global instruction
# she wants to use them
f1()
f2()
f3()
print "test[i,j]=[%s,%s]" % (i,j)
|
Resultados
| f1[i,j]=[1,10]
f2[i,j]=[2,20]
f3[i,j]=[1,30]
test[i,j]=[2,0]
|
Notas:
- O script demonstra a utilização da variável
i, declarada como global nas funções f1 e f2. Neste caso, o programa principal e as funções f1 e f2 partilham a mesma variável i.
3.4. Listas, tuplas e dicionários
3.4.1. Listas unidimensionais
Programa (bases_03)
| # -*- coding=utf-8 -*-
# 1-dimensional lists
# initialization
list1=[0,1,2,3,4,5]
# routes - 1
print "list1 a %s elements" % (len(list1))
for i in range(len(list1)):
print "list1[%s]=%s" % (i, list1[i])
list1[1]=10;
# routes - 2
print "list1 a %s elements" % (len(list1))
for element in list1:
print element
# addition of two elements
list1[len(list1):]=[10,11]
print ("%s") % (list1)
# deletion of last two items
list1[len(list1)-2:]=[]
print ("%s") % (list1)
# addition at the beginning of a tuple list
list1[:0]=[-10, -11, -12]
print ("%s") % (list1)
# mid-list insertion of two elements
list1[3:3]=[100,101]
print ("%s") % (list1)
# deletion of two items in the middle of a list
list1[3:4]=[]
print ("%s") % (list1)
|
Notas:
- a notação array[i:j] refere-se aos elementos de i a j-1 da matriz;
- a notação [i:] refere-se aos elementos i e aos elementos subsequentes da matriz;
- a notação [:i] refere-se aos elementos de 0 a i-1 da lista;
- A linha 20: print (%s) % (list1) exibe a cadeia de caracteres: "[ list1[0], list1[2], ..., list1[n-1]]".
Resultados
| list1 a 6 elements
list1[0]=0
list1[1]=1
list1[2]=2
list1[3]=3
list1[4]=4
list1[5]=5
list1 a 6 elements
0
10
2
3
4
5
[0, 10, 2, 3, 4, 5, 10, 11]
[0, 10, 2, 3, 4, 5]
[-10, -11, -12, 0, 10, 2, 3, 4, 5]
[-10, -11, -12, 100, 101, 0, 10, 2, 3, 4, 5]
[-10, -11, -12, 101, 0, 10, 2, 3, 4, 5]
|
O código anterior pode ser escrito de forma diferente (bases_03b) utilizando determinados métodos de lista:
| # -*- coding=utf-8 -*-
# 1-dimensional lists
# initialization
list1=[0,1,2,3,4,5]
# routes - 1
print "list1 a %s elements" % (len(list1))
for i in range(len(list1)):
print "list1[%s]=%s" % (i, list1[i])
list1[1]=10
# routes - 2
print "list1 a %s elements" % (len(list1))
for element in list1:
print element
# addition of two elements
list1.extend([10,11])
print ("%s") % (list1)
# deletion of last two items
del list1[len(list1)-2:]
print ("%s") % (list1)
# addition at the beginning of a tuple list
for i in (-12, -11, -10):
list1.insert(0,i)
print ("%s") % (list1)
# mid-list insertion
for i in (101,100):
list1.insert(3,i)
print ("%s") % (list1)
# mid-list deletion
del list1[3:4]
print ("%s") % (list1)
|
Os resultados são os mesmos da versão anterior.
3.4.2. O dicionário
O programa (bases_04)
| # -*- coding=utf-8 -*-
def existe(conjoints,mari):
# checks whether the husband key exists in the joint dictionary
if(conjoints.has_key(mari)):
print "La cle [%s] existe associee a la valeur [%s]" % (mari, conjoints[mari])
else:
print "La cle [%s] n'existe pas" % (mari)
# ----------------------------- Main
# dictionaries
conjoints={"Pierre":"Gisele", "Paul":"Virginie", "Jacques":"Lucette","Jean":""}
# routes - 1
print "Nombre d'elements du dictionnaire : %s " % (len(conjoints))
for (cle,valeur) in conjoints.items():
print "conjoints[%s]=%s" % (cle,valeur)
# list of dictionary keys
print "liste des cles-------------"
cles=conjoints.keys()
print ("%s") % (cles)
# list of dictionary values
print "liste des valeurs------------"
valeurs=conjoints.values()
print ("%s") % (valeurs)
# key search
existe(conjoints,"Jacques")
existe(conjoints,"Lucette")
existe(conjoints,"Jean")
# deleting a key-value
del (conjoints["Jean"])
print "Nombre d'elements du dictionnaire : %s " % (len(conjoints))
print ("%s") % (conjoints)
|
Notas:
- linha 17: couples.items() devolve a lista de pares (chave, valor) no dicionário couples;
- linha 22: conjoints.keys() devolve as chaves do dicionário conjoints;
- linha 27: conjoints.values() devolve os valores do dicionário conjoints;
- linha 7: spouses.has_key(husband) retorna True se a chave husband existir no dicionário spouses, False caso contrário;
- linha 38: um dicionário pode ser apresentado numa única linha.
Resultados
| Nombre d'elements du dictionnaire : 4
conjoints[Paul]=Virginie
conjoints[Jean]=
conjoints[Pierre]=Gisele
conjoints[Jacques]=Lucette
liste des cles-------------
['Paul', 'Jean', 'Pierre', 'Jacques']
liste des valeurs------------
['Virginie', '', 'Gisele', 'Lucette']
La cle [Jacques] existe associee a la valeur [Lucette]
La cle [Lucette] n'existe pas
La cle [Jean] existe associee a la valeur []
Nombre d'elements du dictionnaire : 3
{'Paul': 'Virginie', 'Pierre': 'Gisele', 'Jacques': 'Lucette'}
|
3.4.3. Tuplas
Programa (bases_05)
| # -*- coding=utf-8 -*-
# tuples
# initialization
tab1=(0,1,2,3,4,5)
# routes - 1
print "tab1 a %s elements" % (len(tab1))
for i in range(len(tab1)):
print "tab1[%s]=%s" % (i, tab1[i])
# routes - 2
print "tab1 a %s elements" % (len(tab1))
for element in tab1:
print element
# element modification
tab1[0]=-1
|
Os resultados
| tab1 a 6 elements
tab1[0]=0
tab1[1]=1
tab1[2]=2
tab1[3]=3
tab1[4]=4
tab1[5]=5
tab1 a 6 elements
0
1
2
3
4
5
Traceback (most recent call last):
File "exemple_05.py", line 18, in <module>
tab1[0]=-1
TypeError: 'tuple' object does not support item assignment
|
Notas:
- As linhas 15–18 dos resultados: mostram que uma tupla não pode ser modificada.
3.4.4. Listas multidimensionais
Programa (bases_06)
| # -*- coding=utf-8 -*-
# multidimensional lists
# initialization
multi=[[0,1,2], [10,11,12,13], [20,21,22,23,24]]
# route
for i1 in range(len(multi)):
for i2 in range(len(multi[i1])):
print "multi[%s][%s]=%s" % (i1,i2,multi[i1][i2])
# multidimensional dictionaries
# initialization
multi={"zero":[0,1], "un":[10,11,12,13], "deux":[20,21,22,23,24]}
# route
for (cle,valeur) in multi.items():
for i2 in range(len(multi[cle])):
print "multi[%s][%s]=%s" % (cle,i2,multi[cle][i2])
|
Resultados
| multi[0][0]=0
multi[0][1]=1
multi[0][2]=2
multi[1][0]=10
multi[1][1]=11
multi[1][2]=12
multi[1][3]=13
multi[2][0]=20
multi[2][1]=21
multi[2][2]=22
multi[2][3]=23
multi[2][4]=24
multi[zero][0]=0
multi[zero][1]=1
multi[un][0]=10
multi[un][1]=11
multi[un][2]=12
multi[un][3]=13
multi[deux][0]=20
multi[deux][1]=21
multi[deux][2]=22
multi[deux][3]=23
multi[deux][4]=24
|
3.4.5. Ligações entre cadeias de caracteres e listas
Programa (bases_07)
# -*- coding=Utf-8 -*-
# chaîne vers liste
chaine='1:2:3:4'
tab=chaine.split(':')
print type(tab)
# affichage liste
print "tab a %s elements" % (len(tab))
print ("%s") % (tab)
# liste vers chaîne
chaine2=":".join(tab)
print "chaine2=%s" % (chaine2)
# ajoutons un champ vide
chaine+=":"
print "chaine=%s" % (chaine)
tab=chaine.split(":")
# affichage liste
print "tab a %s elements" % (len(tab))
print ("%s") % (tab)
# ajoutons de nouveau un champ vide
chaine+=":"
print "chaine=%s" % (chaine)
tab=chaine.split(":")
# affichage liste
print "tab a %s elements" % (len(tab))
print ("%s") % (tab)
Notas:
- linha 5: o método string.split(separator) divide a string string em elementos separados pelo separador e devolve-os como uma lista. Assim, a expressão '1:2:3:4'.split(":") devolve a lista ('1','2','3','4');
- linha 13: 'separator'.join(list) devolve a cadeia 'list[0]+separator+list[1]+separator+...'.
Resultados
| <type 'list'>
tab a 4 elements
['1', '2', '3', '4']
chaine2=1:2:3:4
chaine=1:2:3:4:
tab a 5 elements
['1', '2', '3', '4', '']
chaine=1:2:3:4::
tab a 6 elements
['1', '2', '3', '4', '', '']
|
3.5. Expressões regulares
Programa (bases_09)
| # -*- coding=utf-8 -*-
import re
# --------------------------------------------------------------------------
def compare(modele,chaine):
# compares chain chain with model chain
# displaying results
print "\nResultats(%s,%s)" % (chaine,modele)
match=re.match(modele,chaine)
if match:
print match.groups()
else:
print "La chaine [%s] ne correspond pas au modele [%s]" % (chaine,modele)
# regular expressions in python
# retrieve the various fields of a string
# the model: a sequence of numbers surrounded by any characters
# you only want to retrieve the sequence of digits
modele=r"^.*?(\d+).*?$"
# the chain is compared with the
compare(modele,"xyz1234abcd")
compare(modele,"12 34")
compare(modele,"abcd")
# the model: a sequence of numbers surrounded by any characters
# we want the sequence of digits and the fields that follow and precede them
modele=r"^(.*?)(\d+)(.*?)$"
# the chain is compared with the
compare(modele,"xyz1234abcd")
compare(modele,"12 34")
compare(modele,"abcd")
# the template - a date in dd/mm/yy format
modele=r"^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$"
compare(modele,"10/05/97")
compare(modele," 04/04/01 ")
compare(modele,"5/1/01")
# the model - a decimal number
modele=r"^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$"
compare(modele,"187.8")
compare(modele,"-0.6")
compare(modele,"4")
compare(modele,".6")
compare(modele,"4.")
compare(modele," + 4")
# end
|
Notas:
- Repare no módulo importado na linha 3. Ele contém as funções para lidar com expressões regulares;
- linha 10: comparar uma cadeia de caracteres com uma expressão regular (padrão) retorna True se a cadeia corresponder ao padrão, False caso contrário;
- linha 12: match.groups() é uma tupla cujos elementos são as partes da cadeia de caracteres que correspondem aos elementos da expressão regular entre parênteses. No padrão:
- ^.*?(\d+).*?, match.groups() será uma tupla de um elemento;
- ^(.*?)(\d+)(.*?)$, match.groups() será uma tupla de 3 elementos.
Resultados
| Resultats(xyz1234abcd,^.*?(\d+).*?$)
('1234',)
Resultats(12 34,^.*?(\d+).*?$)
('12',)
Resultats(abcd,^.*?(\d+).*?$)
La chaine [abcd] ne correspond pas au modele [^.*?(\d+).*?$]
Resultats(xyz1234abcd,^(.*?)(\d+)(.*?)$)
('xyz', '1234', 'abcd')
Resultats(12 34,^(.*?)(\d+)(.*?)$)
('', '12', ' 34')
Resultats(abcd,^(.*?)(\d+)(.*?)$)
La chaine [abcd] ne correspond pas au modele [^(.*?)(\d+)(.*?)$]
Resultats(10/05/97,^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$)
('10', '05', '97')
Resultats( 04/04/01 ,^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$)
('04', '04', '01')
Resultats(5/1/01,^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$)
La chaine [5/1/01] ne correspond pas au modele [^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$]
Resultats(187.8,^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '187.8')
Resultats(-0.6,^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('-', '0.6')
Resultats(4,^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '4')
Resultats(.6,^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '.6')
Resultats(4.,^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '4.')
Resultats( + 4,^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('+', '4')
|
3.6. Modo de passagem de parâmetros de função
Programa (bases_10)
| # -*- coding=utf-8 -*-
def f1(a):
a=2
def f2(a,b):
a=2
b=3
return (a,b)
# ------------------------ hand
x=1
f1(x)
print "x=%s" % (x)
(x,y)=(-1,-1)
(x,y)=f2(x,y)
print "x=%s, y=%s" % (x,y)
|
Resultados
Notas:
- Tudo é um objeto em Python. Alguns objetos são chamados de «imutáveis»: não podem ser modificados. É o caso dos números, das cadeias de caracteres e das tuplas. Quando os objetos Python são passados como argumentos para funções, são as suas referências que são passadas, a menos que esses objetos sejam «imutáveis», caso em que é o valor do objeto que é passado;
- As funções f1 (linha 3) e f2 (linha 6) destinam-se a ilustrar a passagem de um parâmetro de saída. Queremos que o parâmetro real de uma função seja modificado pela função;
- Linhas 3–4: A função f1 modifica o seu parâmetro formal a. Queremos saber se o parâmetro real também será modificado.
- linhas 12–13: o parâmetro real é x = 1. O resultado da linha 1 mostra que o parâmetro real não é modificado. Assim, o parâmetro real x e o parâmetro formal a são dois objetos diferentes;
- linhas 6–9: a função f2 modifica os seus parâmetros formais a e b e devolve-os como resultados;
- linhas 15–16: os parâmetros reais (x, y) são passados para f2, e o resultado de f2 é atribuído a (x, y). A linha 2 dos resultados mostra que os parâmetros reais (x, y) foram modificados.
Concluímos que, quando objetos «imutáveis» são parâmetros de saída, devem fazer parte dos resultados devolvidos pela função.
3.7. Ficheiros de texto
Programa (bases_11)
| # -*- coding=utf-8 -*-
import sys
# sequential operation of a text file
# this is a set of lines of the form login:pwd:uid:gid:infos:dir:shell
# each line is put into a dictionary in the form login => [uid,gid,infos,dir,shell]
# --------------------------------------------------------------------------
def afficheInfos(dico,cle):
# displays the value associated with key in the dico dictionary if it exists
valeur=None
if dico.has_key(cle):
valeur=dico[cle]
if 'list' in str(type(valeur)):
print "[{0},{1}]".format(cle,":".join(valeur))
else:
# key is not a dictionary key dico
print "la cle [{0}] n'existe pas".format(cle)
def cutNewLineChar(ligne):
# delete the end-of-line mark if it exists
l=len(ligne);
while(ligne[l-1]=="\n" or ligne[l-1]=="\r"):
l-=1
return(ligne[0:l]);
# set the file name
INFOS="infos.txt"
# we open it in creation
try:
fic=open(INFOS,"w")
except:
print "Erreur d'ouverture du fichier INFOS en écriture\n"
sys.exit()
# generate arbitrary content
for i in range(1,101):
ligne="login%s:pwd%s:uid%s:gid%s:infos%s:dir%s:shell%s" % (i,i,i,i,i,i,i)
fic.write(ligne+"\n")
# close the file
fic.close()
# open it for reading
try:
fic=open(INFOS,"r")
except:
print "Erreur d'ouverture du fichier INFOS en écriture\n"
sys.exit()
# empty dictionary at start
dico={}
# line reading
ligne=fic.readline()
while(ligne!=''):
# remove the end-of-line character
ligne=cutNewLineChar(ligne)
# put the line in a table
infos=ligne.split(":")
# retrieve login
login=infos[0]
# remove the first two elements [login,pwd]
infos[0:2]=[]
# create a dictionary entry
dico[login]=infos
# line reading
ligne=fic.readline()
# close the file
fic.close()
# using the dictionary
afficheInfos(dico,"login10")
afficheInfos(dico,"X")
|
Notas:
- Linha 37: para encerrar o script a meio do código.
Resultados
O ficheiro infos.txt:
login0:pwd0:uid0:gid0:infos0:dir0:shell0
login1:pwd1:uid1:gid1:infos1:dir1:shell1
login2:pwd2:uid2:gid2:infos2:dir2:shell2
...
login98:pwd98:uid98:gid98:infos98:dir98:shell98
login99:pwd99:uid99:gid99:infos99:dir99:shell99
Saída no ecrã:
| [login10,uid10:gid10:infos10:dir10:shell10]
la cle [X] n'existe pas
|