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).