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.
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:22] tyrtamos |
fichier_acces_direct [2010/10/28 15:43] tyrtamos |
| |
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). |
* 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 |