2010-06-12 7 views
8

J'écris un programme de liste de tâches. Il conserve un fichier avec une chose à faire par ligne, et permet à l'utilisateur d'ajouter ou de supprimer des éléments. Le problème est que pour une raison quelconque, je me retrouve avec beaucoup d'octets zéro au début du fichier, même si l'élément est correctement supprimé. Je vais vous montrer quelques captures d'écran pour m'assurer que je suis clair.Écrire dans un fichier en Python insère des octets nuls

Ceci est le fichier dans le Bloc-notes ++ avant d'exécuter le programme:

Normal todo list http://img683.imageshack.us/img683/2812/beforew.png

Ceci est le fichier après la suppression du point 3 (en comptant à partir de 1):

Item 3 is gone, but there are NUL bytes http://img190.imageshack.us/img190/9387/afterj.png

Ceci est le code pertinent. Le programme actuel est plus grand, mais l'exécution de cette partie déclenche l'erreur.

import os 
TODO_FILE = r"E:\javi\code\Python\todo-list\src\todo.txt" 

def del_elems(f, delete): 
    """Takes an open file and either a number or a list of numbers, and deletes the 
    lines corresponding to those numbers (counting from 1).""" 
    if isinstance(delete, int): 
     delete = [delete] 
    lines = f.readlines() 
    f.truncate(0) 
    counter = 1 
    for line in lines: 
     if counter not in delete: 
      f.write(line) 
     counter += 1 

f = open(TODO_FILE, "r+") 
del_elems(f, 3) 
f.close() 

Pourriez-vous s'il vous plaît indiquer où est l'erreur?

Répondre

9

Il me semble que vous oubliez de rembobiner votre flux de fichier. Après f.truncate(0), ajoutez f.seek(0). Sinon, je pense que votre prochaine écriture essaiera de commencer à la position à partir de laquelle vous vous étiez arrêté, en remplissant les octets nuls sur son chemin.

(Notez que le nombre de caractères nuls dans votre exemple est égal au nombre de caractères dans vos lignes supprimées plus un caractère de saut de ligne retour chariot et pour chacun.)

6

De l'Python manual:

file.truncate([size])
Tronque la taille du fichier. Si l'argument optionnel taille est présent, le fichier est tronqué à (au plus) cette taille. La taille par défaut à la position actuelle. La position actuelle du fichier n'est pas modifiée. Notez que si une taille spécifiée dépasse la taille actuelle du fichier, le résultat est dépendant de la plateforme: le fichier peut rester inchangé, augmenter à la taille spécifiée comme s'il était rempli de zéros ou augmenter à la taille spécifiée avec un nouveau contenu indéfini . Disponibilité: Windows, nombreuses variantes Unix.

Vous tronquez le fichier, puis vous écrivez item1 et item2 à l'ancienne extrémité du fichier. Tout ce qui précède se termine par 0 octet.

f.seek(0) 

Appelez ceci pour réinitialiser la position du fichier après le tronquage.

+0

Merci beaucoup. Votre réponse était aussi bonne que celle de Forest, mais je devais en choisir une à accepter, alors j'ai choisi la première. Rien de personnel. – Javier

3

Prenez l'indice. Ne fais pas ça.

Dans les temps anciens (il y a 30 ans - sérieusement) nous "mis à jour" des fichiers avec une logique complexe ajouter/modifier/supprimer.

De nos jours, la vie est plus simple si vous écrivez des programmes qui

  1. lire le fichier entier en mémoire.

  2. Travail sur les objets en mémoire.Ecrivez les objets dans un fichier périodiquement et lorsque l'utilisateur veut enregistrer.

C'est plus rapide et plus simple. Utilisez pickle pour vider vos objets dans un fichier. Ne jouez pas avec des «dossiers» ou toute tentative de changer un fichier «en place».

Si vous pensez vraiment avoir besoin de fonctionnalités SQL (Insert, Update, Delete), utilisez SQLite. C'est plus fiable que ce que vous essayez de faire.

+1

C'était pour la pratique, mais c'est un point intéressant. Je verrai si je le change pour me comporter comme tu dis. – Javier

Questions connexes