2012-05-02 4 views
1

J'ai une bibliothèque où je veux créer un nouveau livre et ensuite l'ajouter à ma liste de livres. Ce qui me pose problème, c'est de sauvegarder le fichier entre les appels.Enregistrer une liste dans un fichier

Voici comment je l'ai lu le fichier:

def read_bookfile(): 

    try: 
     booklibrary_file = open("a.txt") 

     booklibrary_list = [] 
     booklist = booklibrary_file.readlines() 
     for rad in booklist: 
      linelist = rad.split("/") 
      title = linelist[0] 
      firstname = linelist[1] 
      lastname = linelist[2] 
      isbn = int(linelist[3]) 
      availability = linelist[4] 
      borrowed = linelist[5] 
      late = linelist[6] 
      returnday = linelist[7] 
      b = Book(title, firstname, lastname, isbn, availability, borrowed, late, returnday) 
      booklibrary_list.append(b) 
     booklibrary_file.close() 
     return booklibrary_list 

Maintenant, je veux savoir comment sauver à mon dossier.

+1

Avez-vous envisagé d'utiliser une base de données et/ou ORM pour manipuler ce? –

+0

pourquoi le bloc 'try:' ne contient pas 'except'? – Shep

+1

Comme @AaronCroyle mentionné, il pourrait être préférable de ne pas utiliser un fichier texte pour stocker ces données. Envisager de lire sur [SQLite] (http://docs.python.org/library/sqlite3.html) comme une introduction au stockage de données persistantes. – DoggoDougal

Répondre

7

Pour enregistrer dans un fichier, vous devez l'ouvrir en mode Write-Append.

library_file = open("a.txt", "a") 
... 
library_file.write("Some string\n") 
... 
library_file.close() 

Référez-vous à la documentation de Python sur Built-in Functions pour plus d'informations.

+0

+1 pour diriger vers docs python – Shep

1

Tout d'abord, voici un moyen plus facile à lire, en supposant ces huit champs sont les seuls:

def read_bookfile(filename="a.txt"): 
    with open(filename) as f: 
     return [Book(*line.split('/')) for line in f] 

Maintenant, pour sauver:

def save_bookfile(booklist, filename='a.txt'): 
    with open(filename, 'w') as f: 
     for book in booklist: 
      f.write('/'.join([book.title, book.firstname, book.lastname, str(book.isbn), 
           book.availability, book.borrowed, book.late, book.returnday]) 
        + '\n') 

en supposant que le modèle Book enregistre juste les attributs dans comme ils ont été passés (comme des chaînes).

Explications:

  • La déclaration with ouvre votre dossier et veille à ce qu'il soit fermé lorsque le contrôle de la déclaration, même s'il y a une exception ou quelque chose comme ça.
  • Il est préférable d'utiliser le nom de fichier comme argument, car il vous permet d'utiliser des noms de fichiers différents sans changer la fonction; ceci utilise un argument par défaut pour que vous puissiez toujours l'appeler de la même manière.
  • Le [... for line in f] est une compréhension de liste, qui ressemble à lst = []; for line in f: lst.append(...) mais qui est plus rapide à écrire et à exécuter.
  • L'ouverture d'un fichier en mode 'w' vous permet d'y écrire. Notez que cela supprimera le contenu déjà existant du fichier; vous pouvez utiliser 'a' ou 'w+' pour éviter cela, mais cela nécessite un peu plus de travail pour réconcilier le contenu existant avec votre liste de livres.
  • Le * dans read_bookfile scinde une liste comme si vous les avez passés en tant qu'arguments séparés à une fonction.
  • '/'.join() prend la liste des chaînes et les joint en utilisant des barres obliques: '/'.join(["a", "b", "c"]) est "a/b/c". Il a besoin de chaînes, cependant, c'est pourquoi j'ai fait str(isbn) (parce que book.isbn est un int).
0

Je dois faire quelques hypothèses au sujet de votre classe du livre, mais je pense que cela pourrait vous aider à mettre sur la bonne voie:

bookList = read_bookfile() 

outfile = open("booklist.txt", "w") 

for book in bookList: 
     bookStr = book.title + " " + book.firstname + " " + book.lastname + " " + book.isbn + " " + book.availability + " " + book.borrowed + " " + book.late + " " + book.returnday + "\n" 
     outfile.write(bookStr) 

outfile.close() 
+0

Soyez averti que l'ouverture d'un fichier en mode "w" tronquera toutes les versions précédentes du fichier. Source: [Documentation Python sur les fonctions intégrées] (http://docs.python.org/library/functions.html#open). – DoggoDougal

+1

um, vous passez un tuple à 'write()'? – Shep

+0

Bon point ... étant donné le code du demandeur, il semble que ce soit plus une question de formatage de fichier que de mise à jour d'un catalogue de livres –

1

Python est « batteries inclus », souvenez-vous?

Pensez à l'aide du module « csv »:

use csv 

csv.reader(...) 
csv.writer(...) 

Je pense que ceux-ci ont beaucoup d'options (comme vous pouvez définir vos délimiteurs être autre que des virgules, vous pouvez lire dans une liste de dictionnaires, etc. .)

Voir Python Docs for CSV reader/writer:

Questions connexes