Je veux lire des octets d'un fichier, puis écrire ces octets dans un autre fichier, et enregistrer ce fichier.
Comment dois-je m'y prendre ?
Je veux lire des octets d'un fichier, puis écrire ces octets dans un autre fichier, et enregistrer ce fichier.
Comment dois-je m'y prendre ?
Voici comment le faire avec les opérations de base sur les fichiers en Python. Cette opération ouvre un fichier, lit les données en mémoire, puis ouvre le second fichier et les écrit.
in_file = open("in-file", "rb") # opening for [r]eading as [b]inary
data = in_file.read() # if you only wanted to read 512 bytes, do .read(512)
in_file.close()
out_file = open("out-file", "wb") # open for [w]riting as [b]inary
out_file.write(data)
out_file.close()
Nous pouvons le faire de manière plus succincte en utilisant l'option with
pour gérer la fermeture du fichier.
with open("in-file", "rb") as in_file, open("out-file", "wb") as out_file:
out_file.write(in_file.read())
Si vous ne voulez pas stocker l'ensemble du fichier en mémoire, vous pouvez le transférer par morceaux.
piece_size = 4096 # 4 KiB
with open("in-file", "rb") as in_file, open("out-file", "wb") as out_file:
while True:
piece = in_file.read(piece_size)
if piece == "":
break # end of file
out_file.write(piece)
Dans mes exemples, j'utilise le drapeau 'b' ('wb', 'rb') lors de l'ouverture des fichiers car vous avez dit que vous vouliez lire des octets. Le drapeau 'b' indique à Python de ne pas interpréter les caractères de fin de ligne, qui peuvent varier selon les systèmes d'exploitation. Si vous lisez du texte, omettez le 'b' et utilisez respectivement 'w' et 'r'.
Cette méthode permet de lire l'intégralité du fichier en une seule fois en utilisant le code Python le plus "simple". Le problème avec cette approche est que vous pourriez manquer de mémoire lors de la lecture d'un gros fichier :
ifile = open(input_filename,'rb')
ofile = open(output_filename, 'wb')
ofile.write(ifile.read())
ofile.close()
ifile.close()
Cet exemple est affiné pour lire des morceaux de 1 Mo afin de garantir qu'il fonctionne pour des fichiers de toute taille sans manquer de mémoire :
ifile = open(input_filename,'rb')
ofile = open(output_filename, 'wb')
data = ifile.read(1024*1024)
while data:
ofile.write(data)
data = ifile.read(1024*1024)
ofile.close()
ifile.close()
Cet exemple est le même que le précédent, mais il tire parti de l'utilisation de avec pour créer un contexte. L'avantage de cette approche est que le fichier est automatiquement fermé lorsque l'on quitte le contexte :
with open(input_filename,'rb') as ifile:
with open(output_filename, 'wb') as ofile:
data = ifile.read(1024*1024)
while data:
ofile.write(data)
data = ifile.read(1024*1024)
Voir ce qui suit :
with open("input", "rb") as input:
with open("output", "wb") as output:
while True:
data = input.read(1024)
if data == "":
break
output.write(data)
Ce qui précède va lire 1 kilo-octet à la fois, et l'écrire. Vous pouvez prendre en charge des fichiers incroyablement volumineux de cette manière, car vous n'aurez pas besoin de lire l'intégralité du fichier en mémoire.
Utilisez le ouvrir pour ouvrir le fichier. La fonction open renvoie un Objet du fichier que vous pouvez utiliser pour lire et écrire dans les fichiers :
file_input = open('input.txt') #opens a file in reading mode
file_output = open('output.txt') #opens a file in writing mode
data = file_input.read(1024) #read 1024 bytes from the input file
file_output.write(data) #write the data to the output file
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.