2012-05-02 2 views
1

У меня есть библиотека, где я хочу создать новую книгу, а затем добавить ее в свой список книг. У меня проблемы с сохранением файла между вызовами.Сохранить список в файле

Это, как я прочитал файл:

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 

Теперь я хочу знать, как сохранить в мой файл.

+1

Рассматривали ли вы с помощью базы данных и/или ORM для обработки этого? –

+0

почему 'try:' блок без 'except'? – Shep

+1

Как отметил @AaronCroyle, лучше всего не использовать текстовый файл для хранения этих данных. Рассмотрите возможность чтения на [SQLite] (http://docs.python.org/library/sqlite3.html) в качестве введения в постоянное хранилище данных. – DoggoDougal

ответ

7

Чтобы сохранить файл, вам необходимо открыть его в режиме Write-Append.

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

Обратитесь к документации Пайтона на Built-in Functions для получения дополнительной информации.

+0

+1 для направления в документы python – Shep

1

Во-первых, здесь более простой способ чтения, предполагая, что эти восемь полей являются единственными:

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

Теперь, чтобы спасти:

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') 

предполагая Book модель просто сохраняет эти атрибуты поскольку они были переданы (как строки).

Пояснение:

  • with оператор открывает файл и убеждается, что он закрывается, когда управление переходит из заявления, даже если есть исключение или что-то подобное.
  • Предпочтительным является использование имени файла в качестве аргумента, поскольку оно позволяет использовать разные имена файлов без изменения функции; это использует аргумент по умолчанию, поэтому вы все равно можете вызвать его таким же образом.
  • [... for line in f] - это список, который похож на lst = []; for line in f: lst.append(...), но быстрее писать и запускать.
  • Открытие файла в режиме 'w' позволяет вам написать ему. Обратите внимание, что это приведет к удалению уже существующего содержимого файла; вы можете использовать 'a' или 'w+', чтобы избежать этого, но для этого требуется немного больше работы для согласования существующего содержимого с вашим списком книг.
  • * в read_bookfile разбивает список так, как если бы вы передавали их в виде отдельных аргументов функции.
  • '/'.join() принимает список строк и объединяет их вместе с помощью косых черт: '/'.join(["a", "b", "c"]) является "a/b/c". Ему нужны строки, хотя, поэтому я сделал str(isbn) (потому что book.isbn - это int).
0

Я должен сделать несколько предположений о вашем классе книги, но я думаю, что это может помочь поставить вас на правильном пути:

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

Будьте предупреждены, что открытие файла в режиме «w» приведет к усечению любых предыдущих версий файла. Источник: [Документация по встроенным функциям Python] (http://docs.python.org/library/functions.html#open). – DoggoDougal

+1

um, вы передаете кортеж 'write()'? – Shep

+0

Хорошая точка ... учитывая код афера, похоже, похоже, что это вопрос о форматировании файлов, а не об обновлении каталога книг. –

1

Питон «включены батарейки», помните?

Рассмотрим с помощью модуля «CSV»:

use csv 

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

Я думаю, что у них есть много вариантов (например, вы можете установить разделители быть, кроме запятых, вы можете прочитать, чтобы список словарей и т.д. .)

См Python Docs for CSV reader/writer:

Смежные вопросы