Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
fichier_acces_direct [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


fichier_acces_direct

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
fichier_acces_direct [2008/12/21 09:09]
tyrtamos
fichier_acces_direct [2010/10/28 15:43]
tyrtamos
Ligne 19: Ligne 19:
 ===== Création d'un nouveau fichier en accès direct ===== ===== Création d'un nouveau fichier en accès direct =====
  
-Même si on utilisera par la suite le mode d'ouverture des fichiers 'r+b' (mode de "mise à jour"), on ne peut pas créer un nouveau fichier avec lui. Il faut utiliser le mode "wb" tout simplement.+Même si on utilisera par la suite le mode d'ouverture des fichiers 'rb+' (mode de "mise à jour" = lecture+écriture), on ne peut pas créer un nouveau fichier avec lui. Il faut utiliser le mode "wb" tout simplement. Pour simplifier le code, on ne gère pas ici le déclenchement d'exceptions dues aux erreurs (droit insuffisant pour créer le fichier par exemple)
  
 <code python> <code python>
 # création du fichier # création du fichier
-fichier =  "datas.bdd+fichier =  "datas.fad
-try: +f = open(fichier, 'wb'
-    f = open(fichier, 'wb'+f.close()
-    f.close() +
-except: +
-    print "erreur dans la création du fichier " + fichier+
 </code> </code>
  
-Bien entendu, l'extension du fichier (j'ai mis ".bdd" pour "base de données") peut être n'importe quoi. Cependant, il ne serait pas prudent d'utiliser une extension connue comme ".txt" alors qu'on n'a pas l'intention de créer un fichier texte.+Bien entendu, l'extension du fichier (j'ai mis ".fad" pour "fichier en accès direct") peut être n'importe quoi. Cependant, il ne serait pas prudent d'utiliser une extension connue comme ".txt" alors qu'on n'a pas l'intention de créer un fichier texte.
  
 ===== Détermination et conservation de la longueur des enregistrements ===== ===== Détermination et conservation de la longueur des enregistrements =====
Ligne 48: Ligne 45:
  
 C'est assez facile pour l'enregistrement de chaines de caractères, à une exception près: attention aux encodages unicode qui "consomment" plus de place en octets qu'il n'y a de caractères imprimables! Il serait d'ailleurs sage qu'il y ait dans le code en même temps une vérification/alerte de dépassement et un tronquage pour éviter qu'une chaine trop longue ne recouvre le début de l'enregistrement suivant. C'est assez facile pour l'enregistrement de chaines de caractères, à une exception près: attention aux encodages unicode qui "consomment" plus de place en octets qu'il n'y a de caractères imprimables! Il serait d'ailleurs sage qu'il y ait dans le code en même temps une vérification/alerte de dépassement et un tronquage pour éviter qu'une chaine trop longue ne recouvre le début de l'enregistrement suivant.
- 
-Si vous voulez évaluer le nombre d'octets nécessaire pour stocker une chaine encodée en utf-8, sur la base de statistiques, vous pouvez créer cette fonction: 
- 
-<code python> 
-def lenunic(ch): 
-    n = 0 
-    for c in ch: 
-        n += 1 + int((ord(c) > 255)) 
-    return n 
- 
-x = u"éèàçôîêöùλ" 
-print len(x) # => affiche 10 (il y a bien 10 lettres) 
-print lenunic(x)  # => affiche 11, car les 10 lettres codées en utf-8 prendront 11 octets à cause de la dernière lettre "λ": ord(u"λ")=955 
-</code> 
  
 Pour conserver cette longueur d'une session à l'autre, quand il n'y a qu'un seul programme qui accède au fichier, on peut la conserver dans le programme en la codant "en dur" (exemple: lge = 25). Pour conserver cette longueur d'une session à l'autre, quand il n'y a qu'un seul programme qui accède au fichier, on peut la conserver dans le programme en la codant "en dur" (exemple: lge = 25).
Ligne 139: Ligne 122:
     * fin = f.tell() renvoie cette position     * fin = f.tell() renvoie cette position
     * => on sait donc jusqu'où on peut lire: on doit s'arrêter quand i*lge>=fin!     * => on sait donc jusqu'où on peut lire: on doit s'arrêter quand i*lge>=fin!
-    * et on sait aussi qu'il y a déjà: fin//lge enregistrements dans le fichier+    * et on sait aussi qu'il y a déjà: %%fin//lge%% enregistrements dans le fichier
  
   * vous voyez l'utilisation de .rstrip() pour éliminer les octets de remplissage   * vous voyez l'utilisation de .rstrip() pour éliminer les octets de remplissage
fichier_acces_direct.txt · Dernière modification: 2010/10/28 15:43 de tyrtamos