web-dev-qa-db-fra.com

Supprimer le contenu d'un fichier avant d'y écrire (en Python)?

J'essaie de ma part ce problème de rosalind et je rencontre un problème. Je crois que tout dans mon code est correct, mais ce n'est évidemment pas le cas car il ne fonctionne pas comme prévu. je veux supprimer le contenu du fichier, puis écrire du texte dans ce fichier. Le programme écrit le texte que je veux, mais il ne supprime pas d'abord le contenu initial.

def ini5(file):
raw = open(file, "r+")
raw2 = (raw.read()).split("\n")
clean = raw2[1::2]
raw.truncate()
for line in clean:
    raw.write(line)
    print(line)

J'ai vu:

Comment supprimer le contenu d'un fichier avant d'y écrire dans un script python?

Mais mon problème persiste toujours. Qu'est-ce que je fais mal?

6
Tare Gaskin

truncate() tronque à la position actuelle . Selon sa documentation, emphase ajoutée:

Redimensionner le flux à la taille donnée en octets (ou la position actuelle si la taille n'est pas spécifiée).

Après une read(), la position actuelle est la fin du fichier. Si vous souhaitez tronquer et réécrire avec ce même descripteur de fichier, vous devez effectuer une seek(0) pour revenir au début.

Donc:

raw = open(file, "r+")
contents = raw.read().split("\n")
raw.seek(0)                        # <- This is the missing piece
raw.truncate()
raw.write('New contents\n')

(Vous auriez également pu passer raw.truncate(0), mais cela aurait laissé le pointeur - et donc l'emplacement des futures écritures - à une position autre que le début du fichier, rendant votre fichier clairsemé lorsque vous avez commencé lui écrivant à cette position).

16
Charles Duffy

Si vous souhaitez remplacer complètement les anciennes données du fichier, vous devez utiliser un autre mode pour ouvrir le fichier.

Ça devrait être:

raw = open(file, "w") # or "wb"

Pour résoudre votre problème, lisez d'abord le contenu du fichier:

with open(file, "r") as f: # or "rb"
    file_data = f.read()
# And then:
raw = open(file, "w")

Ensuite, ouvrez-le en utilisant le mode write. De cette façon, vous n'ajouterez pas votre texte au fichier, vous y écrivez uniquement vos données.

Lisez à propos des fichiers de mode ici .

5
Ofer Arial