Vous n'avez pas besoin de lire tout le fichier en une seule fois, vous pouvez le lire par parties et écrire au fur et à mesure que vous lisez (notez la balise with
Le bloc est utilisé pour deux open()
les gestionnaires de contexte, bien que vous puissiez les imbriquer les uns dans les autres tout aussi facilement)
with open(source) as fh_src, open(destination, "w") as fh_dest:
block = []
for lineno, line in enumerate(fh_src, 1):
# .split("=", 1)[-1] captures everything after the first =
# this is also an opportunity to verify the key
block.append(line.split("=", 1)[-1].strip())
if len(block) == 4:
fh_dest.write("{}|{}|{}|{}\n".format(*block))
block = [] # reset block after each write
Mais cela vaut vraiment la peine de mettre en place des garde-fous !
- vérifier si les lignes commencent vraiment avec une clé si vous avez un ensemble de clés connues ou si vous avez l'intention d'en omettre certaines, ou si vous avez un ensemble dynamique de clés (disons que certains utilisateurs ont une collection de hachages de mots de passe précédents, ou des commentaires différents)
- vérification de
if block
à la fin (cela devrait être effacé et écrit !)
- vérification de
=
est réellement dans chaque ligne ou que tout commentaire est conservé ou écarté.
- ouverture du site
"w"
supprimera destination
s'il existe déjà (peut-être à la suite d'une précédente exécution bâclée), ce qui peut être indésirable.
( lineno
est seulement inclus pour simplifier la découverte des mauvaises lignes)