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

ファイルに保存する方法を知りたいです。

4

4 に答える 4

7

ファイルに保存するには、書き込み-追加モードで開く必要があります。

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

詳細については、組み込み関数に関するPythonのドキュメントを参照してください。

于 2012-05-02T18:21:34.693 に答える
1

まず、これらの 8 つのフィールドが唯一のものであると仮定すると、読みやすくなります。

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+'、回避したりすることはできますが、既存のコンテンツと本のリストを調整するには、もう少し作業が必要です。
  • *in はread_bookfile、関数に個別の引数として渡したかのように、リストを分割します。
  • '/'.join()文字列のリストを取得し、スラッシュを使用してそれらを結合します: '/'.join(["a", "b", "c"])is "a/b/c". ただし、文字列が必要です。これが私が行った理由ですstr(isbn)book.isbnintであるため)。
于 2012-05-02T18:25:17.837 に答える
1

Pythonは「バッテリーが含まれています」、覚えていますか?

「csv」モジュールの使用を検討してください。

use csv

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

これらには多くのオプションがあると思います(区切り文字をコンマ以外に設定できる、辞書のリストを読み込むことができるなど)。

CSV リーダー/ライターの Python ドキュメントを参照してください。

于 2012-05-02T20:20:10.790 に答える
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()
于 2012-05-02T18:27:24.847 に答える