Python - Compression des données

Bonjour à tous, futurs sorciers Python ! Aujourd'hui, nous plongeons dans le monde fascinant de la compression des données. En tant que votre enseignant de informatique de quartier, je suis ravi de vous guider à travers ce voyage, même si vous n'avez jamais écrit une seule ligne de code auparavant. Ne vous inquiétez pas ; nous commencerons par les bases et nous nous enfoncerons progressivement. Alors, prenez vos baguettes virtuelles (claviers), et faisons de la magie avec les données !

Python - Data Compression

Introduction à la compression des données

Qu'est-ce que la compression des données ?

Imaginez que vous essayez de faire rentrer tous vos vêtements dans une valise pour vos vacances. La compression des données est comme plier ces vêtements très proprement pour pouvoir rentrer plus dans le même espace. Dans le monde numérique, il s'agit de rendre les fichiers plus petits sans perdre d'informations importantes.

Pourquoi la compression des données est-elle importante ?

  1. Économise de l'espace de stockage
  2. Réduit le temps de transmission
  3. Réduit l'utilisation de la bande passante
  4. Améliore la performance du système

Maintenant que nous savons pourquoi c'est important, mettons-nous au travail et passons aux codes Python !

Compression de chaîne de base

Commençons par un exemple simple de compression d'une chaîne. Nous utiliserons une technique appelée codage de longueur de la séquence.

def compress_string(s):
compressed = ""
count = 1
for i in range(1, len(s)):
if s[i] == s[i-1]:
count += 1
else:
compressed += s[i-1] + str(count)
count = 1
compressed += s[-1] + str(count)
return compressed

# essayons-le
original = "aaabbbccccddeeee"
compressed = compress_string(original)
print(f"Original: {original}")
print(f"Compressé: {compressed}")

Lorsque vous exécutez ce code, vous verrez :

Original: aaabbbccccddeeee
Compressé: a3b3c4d2e4

Que se passe-t-il ici ? Nous comptons les caractères consécutifs et les remplaçons par le caractère suivi du compteur. C'est cool, non ?

Compression de fichiers avec zlib

Maintenant, augmentons la difficulté et compressons des fichiers réels en utilisant le module zlib. Ne vous inquiétez pas si vous ne savez pas encore ce qu'est un module – pensez-y comme une boîte à outils de code pré-écrit que nous pouvons utiliser.

import zlib

def compress_file(input_file, output_file):
with open(input_file, 'rb') as file_in:
data = file_in.read()

compressed_data = zlib.compress(data, level=9)

with open(output_file, 'wb') as file_out:
file_out.write(compressed_data)

print(f"Taille originale: {len(data)} octets")
print(f"Taille compressée: {len(compressed_data)} octets")
print(f"Ratio de compression: {len(compressed_data) / len(data):.2%}")

# Comprimons un fichier
compress_file('example.txt', 'example.txt.gz')

Ce script lit un fichier, compresse son contenu et enregistre les données compressées dans un nouveau fichier. Le niveau de compression (9) est le plus élevé, ce qui signifie une compression maximale.

Décompression : Ramener vos données

Bien sûr, les données compressées ne servent à rien si nous ne pouvons pas les décompresser. Écrivons une fonction pour le faire :

def decompress_file(input_file, output_file):
with open(input_file, 'rb') as file_in:
compressed_data = file_in.read()

decompressed_data = zlib.decompress(compressed_data)

with open(output_file, 'wb') as file_out:
file_out.write(decompressed_data)

print(f"Taille décompressée: {len(decompressed_data)} octets")

# Décomprimons notre fichier
decompress_file('example.txt.gz', 'example_decompressed.txt')

Cette fonction fait l'inverse de notre fonction de compression. Elle lit le fichier compressé, décompresse les données et les écrit dans un nouveau fichier.

Comparaison des méthodes de compression

Maintenant que nous avons vu quelques techniques de compression, comparons-les. Nous utiliserons un tableau pour rendre les différences visibles :

Méthode Avantages Inconvénients Meilleur utilisé pour
Codage de longueur de la séquence Simple à implémenter Seulement efficace pour les caractères répétés Images bitmap, motifs simples
zlib Haut ratio de compression, largement supporté Plus lent que les méthodes plus simples Compression polyvalente, protocoles réseau

Sujet avancé : Compression d'images

Pour ceux d'entre vous qui sont aventuriers, jetons un coup d'œil rapide à la compression d'images en utilisant la bibliothèque Pillow. Ne vous inquiétez pas si cela semble complexe – c'est juste pour vous donner un aperçu de ce qui est possible !

from PIL import Image

def compress_image(input_file, output_file, quality):
with Image.open(input_file) as img:
img.save(output_file, optimize=True, quality=quality)

# Comprimons une image
compress_image('example.jpg', 'compressed_example.jpg', 50)

Ce script ouvre une image, la compresse en réduisant sa qualité, et l'enregistre comme un nouveau fichier. Le paramètre quality varie de 1 (pire) à 95 (meilleur).

Conclusion

Félicitations ! Vous avez juste pris vos premiers pas dans le monde de la compression des données avec Python. Nous avons couvert la compression de chaîne de base, la compression et décompression de fichiers, et même touché à la compression d'images. Rappelez-vous, la compression consiste à trouver des motifs et à les représenter plus efficacement.

À mesure que vous continuez votre voyage avec Python, vous découvrirez des techniques de compression encore plus puissantes. Qui sait ? Peut-être que vous inventerez la prochaine avancée dans la compression des données ! En attendant, continuez à coder, restez curieux, et n'oubliez pas de vous amuser en chemin.

Credits: Image by storyset