【问题标题】:Save a list to a file将列表保存到文件
【发布时间】:2012-05-02 18:17:28
【问题描述】:

我有一个图书馆,我想在其中创建一本新书,然后将其添加到我的书单中。 我遇到的问题是在调用之间保存文件。

这是我读取文件的方式:

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

现在我想知道如何保存到我的文件中。

【问题讨论】:

  • 您是否考虑过使用数据库和/或 ORM 来处理此问题?
  • 为什么try: 块没有except
  • 正如@AaronCroyle 提到的,最好不要使用文本文件来存储这些数据。考虑阅读 SQLite 作为持久数据存储的介绍。

标签: python file list save


【解决方案1】:

要保存到文件,您必须以写入附加模式打开它。

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

有关更多信息,请参阅Built-in Functions 上的 Python 文档。

【讨论】:

    【解决方案2】:

    首先,假设这八个字段是唯一的,这里有一个更容易阅读的方法:

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

    【讨论】:

      【解决方案3】:

      Python 是“包括电池的”,记得吗?

      考虑使用“csv”模块:

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

      我认为这些有很多选项(例如,您可以将分隔符设置为逗号以外;您可以读取字典列表等)

      Python Docs for CSV reader/writer:

      【讨论】:

        【解决方案4】:

        我必须对您的 Book 课程做出一些假设,但我认为这可能有助于您走上正轨:

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

        【讨论】:

        • 请注意,以“w”模式打开文件将截断该文件的任何先前版本。来源:Python Documentation on Built-in Functions.
        • 嗯,你将一个元组传递给write()
        • 好点...不过考虑到提问者的代码,它似乎更像是一个文件格式问题,而不是关于更新书籍目录的问题
        • 天哪,Shep...我是个假人。固定
        • 请注意,原始文件是用斜杠分割读取的,所以可能你想用斜杠而不是空格来加入......
        猜你喜欢
        • 2015-02-07
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多