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 ?

4voto

Abhranil Das Points 1993
  1. Analyser le fichier dans une liste python en utilisant file.readlines() o file.read().split('\n')
  2. Identifiez l'endroit où vous devez insérer une nouvelle ligne, selon vos critères.
  3. Insérer un nouvel élément de liste à cet endroit en utilisant list.insert() .
  4. Écrire le résultat dans le fichier.

4voto

redcurry Points 1270

Vous ne nous montrez pas à quoi devrait ressembler la sortie, donc une interprétation possible est que vous voulez ceci comme sortie :

  1. Alfred
  2. Projet de loi
  3. Charlie
  4. Donald

(Insérez Charlie, puis ajoutez 1 à toutes les lignes suivantes.) Voici une solution possible :

def insert_line(input_stream, pos, new_name, output_stream):
  inserted = False
  for line in input_stream:
    number, name = parse_line(line)
    if number == pos:
      print >> output_stream, format_line(number, new_name)
      inserted = True
    print >> output_stream, format_line(number if not inserted else (number + 1), name)

def parse_line(line):
  number_str, name = line.strip().split()
  return (get_number(number_str), name)

def get_number(number_str):
  return int(number_str.split('.')[0])

def format_line(number, name):
  return add_dot(number) + ' ' + name

def add_dot(number):
  return str(number) + '.'

input_stream = open('input.txt', 'r')
output_stream = open('output.txt', 'w')

insert_line(input_stream, 3, 'Charlie', output_stream)

input_stream.close()
output_stream.close()

3voto

Silentterms Points 41
location_of_line = 0
with open(filename, 'r') as file_you_want_to_read:
     #readlines in file and put in a list
     contents = file_you_want_to_read.readlines()

     #find location of what line you want to insert after
     for index, line in enumerate(contents):
            if line.startswith('whatever you are looking for')
                   location_of_line = index

#now you have a list of every line in that file
context.insert(location_of_line, "whatever you want to append to middle of file")
with open(filename, 'w') as file_to_write_to:
        file_to_write_to.writelines(contents)

C'est ainsi que j'ai fini par obtenir les données que je souhaite insérer au milieu du fichier.

Il s'agit d'un pseudo-code, car j'ai eu du mal à comprendre clairement ce qui se passe.

essentiellement, vous lisez le fichier dans son intégralité et l'ajoutez à une liste, puis vous insérez les lignes que vous souhaitez dans cette liste et réécrivez ensuite dans le même fichier.

Je suis sûr qu'il y a de meilleures façons de procéder, ce n'est peut-être pas efficace, mais c'est plus logique pour moi en tout cas, j'espère que c'est logique pour quelqu'un d'autre.

2voto

Amir Rezazadeh Points 115

Une méthode simple mais peu efficace consiste à lire l'ensemble du contenu, à le modifier et à le réécrire :

line_index = 3
lines = None
with open('file.txt', 'r') as file_handler:
    lines = file_handler.readlines()

lines.insert(line_index, 'Charlie')

with open('file.txt', 'w') as file_handler:
    file_handler.writelines(lines)

1voto

KlinZ Points 3

J'écris ceci afin de réutiliser/corriger Réponse de martincho (acceptée)

! IMPORTANT : Ce code charge tous les fichiers dans la mémoire vive et réécrit le contenu du fichier.

Variables index , value peut être ce que vous souhaitez, mais veillez à ce qu'il soit valorisé. chaîne de caractères et se termine par ' \n ' si vous ne voulez pas qu'il perturbe les données existantes.

with open("path_to_file", "r+") as f:
    # Read the content into a variable
    contents = f.readlines()
    contents.insert(index, value)

    # Reset the reader's location (in bytes)
    f.seek(0)

    # Rewrite the content to the file
    f.writelines(contents)

Voir la documentation python sur la méthode file.seek : Documentation Python

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