L'encodage des caractères est fodnamental pour la représentation des données textuelles. ASCII est le jeu de caractères de base, tandis que Unicode offre une couverture étendue. En Python, l'encodage par défaut varie selon la version : ASCII pour Python 2 et UTF-8 pour Python 3. D'autres encodages comme GBK sont utilisés pour des langues spécifiques, mais UTF-8 est devenu un standard pour sa compatibilité et son efficacité. Les fichiers encodés en Unicode utilisent généralement deux octets par caractère, tandis qu'UTF-8 est un encodage à longueur variable, optimisé pour le stockage et le transfert.
Il existe différents types de chaînes en Python. Les chaînes préfixées par 'r' sont des chaînes brutes, celles avec 'u' sont des chaînes Unicode standard, et les chaînes binaires représentent des données sous forme binaire, souvent utilisées pour le stockage ou le transfert de fichiers non textuels comme les images ou les vidéos. Pour les données textuelles, UTF-8 est couramment employé, mais d'autres encodages s'appliquent aux médias.
donnees = 'ABCDEF123'
for elem in donnees:
if 65 <= ord(elem) <= 70:
print(elem)
Les fonctions ord() et chr() permettent de convertir entre caractères et leurs valeurs ASCII. Par exemple, ord('A') renvoie 65, et chr(65) renvoie 'A'. Cette conversion est utile pour les manipulations de caractères basiques.
valeur = ord('A')
print(valeur)
caractere = chr(65)
print(caractere)
# Conversion pour des caractères spéciaux
print(ord('€'), chr(8364))
La lecture et l'écriture de fichiers impliquent trois étapes : ouverture, opération et fermeture. L'instruction with simplifie la gestion en libérant automatiquement les ressources. Les modes principaux incluent 'r' pour la lecture, 'w' pour l'écriture avec création ou effacement, et 'a' pour l'ajout avec création. Des modes secondaires comme 't' pour le texte et 'b' pour le binaire peuvent être combinés.
# Ouverture avec gestion automatique
with open('exemple.txt', 'r', encoding='utf-8') as fichier:
contenu = fichier.read()
print(contenu)
# Écriture dans un fichier
with open('resultat.txt', 'w', encoding='utf-8') as fichier:
fichier.write('Nouvelle ligne\n')
fichier.flush()
Pour copier un fichier, on peut lire les données ligne par ligne et les écrire dans un nouveau fichier. Cela permet de traiter de grands fichiers sans surcharger la mémoire.
# Copie de fichier texte
with open('source.txt', 'r', encoding='utf-8') as lecteur, open('copie.txt', 'w', encoding='utf-8') as ecrivain:
for ligne in lecteur:
ecrivain.write(ligne)
ecrivain.flush()
# Copie avec ajout
with open('source.txt', 'r', encoding='utf-8') as src:
with open('destination.txt', 'a+', encoding='utf-8') as dst:
for ligne in src:
dst.write(ligne)
Les modes binaires ('b') sont nécessaires pour les fichiers non textuels, comme les images, car ils traitent les données directement en octets sans décodage. Les modes avec '+' permettent une lecture et écriture simultanées, mais sont moins courants.
Le déplacement du curseur dans un fichier est possible avec la méthode seek(), qui prend un décalage en octets et une position de référence (0 pour le début, 1 pour la position actuelle, 2 pour la fin). Cela est utile pour accéder à des parties spécifiques d'un fichier, comme dans le cas du transfert instantané basé sur des empreintes de données.
# Manipulation du curseur
with open('donnees.bin', 'rb') as fichier:
# Lecture depuis le début
donnees_debut = fichier.read(10)
print(donnees_debut)
position = fichier.tell()
print(position)
# Déplacement à la fin pour lire les derniers octets
fichier.seek(-5, 2)
donnees_fin = fichier.read()
print(donnees_fin.decode('utf-8', errors='ignore'))
# Écriture avec curseur
with open('donnees.bin', 'rb+') as fichier:
fichier.seek(10)
fichier.write(b'000')
Pour implémenter un système de transfert instantané, on peut extraire des segments de données à des positions stratégiques d'un fichier, comme le début, le tiers, les deux tiers et la fin. Ces segments sont concaténés pour former une empriente unique qui est comparée lors du transfert pour éviter une copie complète si les données sont identiques.
# Extraction de segments pour transfert instantané
empreinte = b''
with open('image.png', 'rb') as fichier:
contenu = fichier.read()
taille = len(contenu)
fichier.seek(0, 0)
segment1 = fichier.read(10)
fichier.seek(taille // 3, 0)
segment2 = fichier.read(10)
fichier.seek(taille * 2 // 3, 0)
segment3 = fichier.read(10)
fichier.seek(-10, 2)
segment4 = fichier.read(10)
empreinte = segment1 + segment2 + segment3 + segment4
# Vérification pour transfert
nouvelle_empreinte = b''
with open('image.png', 'rb') as fichier:
contenu = fichier.read()
taille = len(contenu)
fichier.seek(0, 0)
nouvelle_empreinte += fichier.read(10)
fichier.seek(taille // 3, 0)
nouvelle_empreinte += fichier.read(10)
fichier.seek(taille * 2 // 3, 0)
nouvelle_empreinte += fichier.read(10)
fichier.seek(-10, 2)
nouvelle_empreinte += fichier.read(10)
if nouvelle_empreinte == empreinte:
print('Transfert instantané réussi')
else:
print('Transfert complet nécessaire')