102 votes

Insérer une ligne au milieu d'un fichier avec Python ?

Existe-t-il un moyen de le faire ? Disons que j'ai un fichier qui est une liste de noms qui se présente comme suit :

  1. Alfred
  2. Projet de loi
  3. Donald

Comment puis-je insérer le troisième nom, "Charlie", à la ligne x (dans ce cas 3), et envoyer automatiquement tous les autres sur une ligne ? J'ai vu d'autres questions de ce type, mais elles n'ont pas reçu de réponses utiles. Est-ce possible, de préférence avec une méthode ou une boucle ?

-2voto

Ajax Points 1

Vous trouverez ci-dessous une solution un peu bizarre pour le cas particulier où vous créez vous-même le fichier original et où vous connaissez l'emplacement d'insertion (par exemple, vous savez à l'avance que vous devrez insérer une ligne avec un nom supplémentaire avant la troisième ligne, mais vous ne connaîtrez pas le nom avant d'avoir récupéré et écrit le reste des noms). La lecture, le stockage et la réécriture de l'ensemble du contenu du fichier, tels qu'ils sont décrits dans d'autres réponses, sont, je pense, plus élégants que cette option, mais peuvent être indésirables pour les gros fichiers.

Vous pouvez laisser un tampon de caractères nuls invisibles ('). \0 ') à l'emplacement d'insertion qui sera écrasé ultérieurement :

num_names = 1_000_000    # Enough data to make storing in a list unideal
max_len = 20             # The maximum allowed length of the inserted line
line_to_insert = 2       # The third line is at index 2 (0-based indexing)

with open(filename, 'w+') as file:
    for i in range(line_to_insert):
        name = get_name(i)                    # Returns 'Alfred' for i = 0, etc.
        file.write(F'{i + 1}. {name}\n')

    insert_position = file.tell()             # Position to jump back to for insertion
    file.write('\0' * max_len + '\n')         # Buffer will show up as a blank line

    for i in range(line_to_insert, num_names):
        name = get_name(i)
        file.write(F'{i + 2}. {name}\n')      # Line numbering now bumped up by 1.

# Later, once you have the name to insert...
with open(filename, 'r+') as file:            # Must use 'r+' to write to middle of file 
    file.seek(insert_position)                # Move stream to the insertion line
    name = get_bonus_name()                   # This lucky winner jumps up to 3rd place
    new_line = F'{line_to_insert + 1}. {name}'
    file.write(new_line[:max_len])            # Slice so you don't overwrite next line

Malheureusement, il n'existe aucun moyen d'effacer sans remplacement les caractères null excédentaires qui n'ont pas été écrasés (ou, en général, tout caractère situé au milieu d'un fichier), à moins de réécrire tout ce qui suit. Mais les caractères nuls n'affecteront pas l'apparence de votre fichier pour un humain (ils ont une largeur nulle).

Prograide.com

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.

Powered by:

X