« Programmation Python/Fichiers » : différence entre les versions

Contenu supprimé Contenu ajouté
déplacé des chaines
Ligne 393 :
 
== Exercices ==
 
{{Exercices}}
# Écrivez un script qui compte dans un fichier texte quelconque le nombre de lignes contenant des caractères numériques.
# Écrivez un script qui compte le nombre de mots contenus dans un fichier texte.
# Écrivez un script qui recopie un fichier texte en veillant à ce que chaque ligne commence par une majuscule.
# Écrivez un script qui recopie un fichier texte en fusionnant (avec la précédente) les lignes qui ne commencent pas par une majuscule.
# Vous disposez d'un fichier contenant des valeurs numériques. Considérez que ces valeurs sont les diamètres d'une série de sphères. Écrivez un script qui utilise les données de ce fichier pour en créer un autre, organisé en lignes de texte qui exprimeront « en clair » les autres caractéristiques de ces sphères (surface de section, surface extérieure et volume), dans des phrases telles que :<br />Diam. 46.20 cm Section = 1676.39 cm² Surf. = 6705.54 cm². Vol. = 51632.67 cm³<br />Diam. 120.00 cm Section = 11309.73 cm² Surf. = 45238.93 cm². Vol. = 904778.68 cm³<br />Diam. 0.03 cm Section = 0.00 cm² Surf. = 0.00 cm². Vol. = 0.00 cm³<br />Diam. 13.90 cm Section = 151.75 cm² Surf. = 606.99 cm². Vol. = 1406.19 cm³<br />Diam. 88.80 cm Section = 6193.21 cm² Surf. = 24772.84 cm². Vol. = 366638.04 cm³<br />etc.
# Vous avez à votre disposition un fichier texte dont les lignes représentent des valeurs numériques de type réel, sans exposant (et encodées sous forme de chaînes de caractères).<br />Écrivez un script qui recopie ces valeurs dans un autre fichier en les arrondissant de telle sorte que leur partie décimale ne comporte plus qu'un seul chiffre après la virgule, celui-ci ne pouvant être que 0 ou 5 (l'arrondi doit être correct).
{{solution}}
<ol>
<li>Réfléchissez !</li>
<li>
<source lang=python>
# Comptage du nombre de mots dans un texte
 
fiSource = raw_input("Nom du fichier à traiter : ")
fs = open(fiSource, 'r')
 
n = 0 # variable compteur
while 1:
ch = fs.readline()
if ch == "":
break
# conversion de la chaîne lue en une liste de mots :
li = ch.split()
# totalisation des mots :
n = n + len(li)
fs.close()
print("Ce fichier texte contient un total de %s mots" % (n))
</source>
</li>
<li>
<source lang=python>
# Conversion en majuscule du premier caractère de chaque ligne
 
fiSource = raw_input("Nom du fichier à traiter : ")
fiDest = raw_input("Nom du fichier destinataire : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')
 
while 1:
ch = fs.readline()
if ch == "":
break
if ch[0] >= "A" and ch[0] <= "Z":
# le premier car. est une majuscule. On passe.
pass
else:
# Reconstruction de la chaîne:
pc = ch[0].upper() # Premier caractère converti
rc = ch[1:] # toute le reste de la chaîne
ch = pc + rc # fusion
# variante utilisant une méthode encore plus intégrée :
# ch = ch.capitalize()
# Transcription :
fd.write(ch)
 
fd.close()
fs.close()
</source>
</li>
<li>
<source lang=python>
# Fusion de lignes pour former des phrases
 
fiSource = raw_input("Nom du fichier à traiter : ")
fiDest = raw_input("Nom du fichier destinataire : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')
 
 
# On lit d'abord la première ligne :
ch1 = fs.readline()
# On lit ensuite les suivantes, en les fusionnant si nécessaire :
while 1:
ch2 = fs.readline()
if ch2 == "":
break
# Si la chaîne lue commence par une majuscule, on transcrit
# la précédente dans le fichier destinataire, et on la
# remplace par celle que l'on vient de lire :
if ch2[0] >= "A" and ch2[0] <= "Z":
fd.write(ch1)
ch1 = ch2
# Sinon, on la fusionne avec la précédente :
else:
ch1 = ch1[:-1] + " " + ch2
# (veiller à enlever de ch1 le caractère de fin de ligne)
fd.write(ch1) # ne pas oublier de transcrire la dernière !
fd.close()
fs.close()
</source>
</li>
<li>
<source lang=python>
# Caractéristiques de sphères :
# Le fichier de départ est un fichier <texte> dont chaque ligne contient
# un nombre réel (encodé sous la forme d'une chaîne de caractères)
 
from math import pi
 
def caractSphere(d):
"renvoie les caractéristiques d'une sphère de diamètre d"
d = float(d) # conversion de l'argument (=chaîne) en réel
r = d/2 # rayon
ss = pi*r**2 # surface de section
se = 4*pi*r**2 # surface extérieure
v = 4./3*pi*r**3 # volume (! la 1e division doit être réelle !)
# Le marqueur de conversion %8.2f utilisé ci-dessous formate le nombre
# affiché de manière à occuper 8 caractères au total, en arrondissant
# de manière à conserver deux chiffres après la virgule :
ch = "Diam. %6.2f cm Section = %8.2f cm² " % (d, ss)
ch = ch +"Surf. = %8.2f cm². Vol. = %9.2f cm³" % (se, v)
return ch
 
fiSource = raw_input("Nom du fichier à traiter : ")
fiDest = raw_input("Nom du fichier destinataire : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')
while 1:
diam = fs.readline()
if diam == "" or diam == "\n":
break
fd.write(caractSphere(diam) + "\n") # enregistrement
fd.close()
fs.close()
</source>
</li>
<li>
<source lang=python>
# Mise en forme de données numériques
# Le fichier traité est un fichier <texte> dont chaque ligne contient un nombre
# réel (sans exposants et encodé sous la forme d'une chaîne de caractères)
 
def arrondir(reel):
"représentation arrondie à .0 ou .5 d'un nombre réel"
ent = int(reel) # partie entière du nombre
fra = reel - ent # partie fractionnaire
if fra < .25 :
fra = 0
elif fra < .75 :
fra = .5
else:
fra = 1
return ent + fra
 
fiSource = raw_input("Nom du fichier à traiter : ")
fiDest = raw_input("Nom du fichier destinataire : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')
while 1:
ligne = fs.readline()
if ligne == "" or ligne == "\n":
break
n = arrondir(float(ligne)) # conversion en <float>, puis arrondi
fd.write(str(n) + "\n") # enregistrement
 
fd.close()
fs.close()
</source>
</li>
</ol>
{{fin}}
 
{{Exercices}}
<ol>