Il existe une combinaison de techniques que j'ai trouvée utile pour résoudre ce problème :
with open(file, 'r+') as fd:
contents = fd.readlines()
contents.insert(index, new_string) # new_string should end in a newline
fd.seek(0) # readlines consumes the iterator, so we need to start over
fd.writelines(contents) # No need to truncate as we are increasing filesize
Dans notre application particulière, nous voulions l'ajouter après une certaine chaîne de caractères :
with open(file, 'r+') as fd:
contents = fd.readlines()
if match_string in contents[-1]: # Handle last line to prevent IndexError
contents.append(insert_string)
else:
for index, line in enumerate(contents):
if match_string in line and insert_string not in contents[index + 1]:
contents.insert(index + 1, insert_string)
break
fd.seek(0)
fd.writelines(contents)
Si vous souhaitez qu'il insère la chaîne après chaque occurrence de la correspondance, au lieu de la première seulement, supprimez l'attribut else:
(et correctement désindenté) et le break
.
Il convient également de noter que le and insert_string not in contents[index + 1]:
l'empêche d'ajouter plus d'une copie après le match_string
Il est donc possible de l'exécuter plusieurs fois en toute sécurité.