从文件中读取元组列表/将数据保存到文件

Posted

技术标签:

【中文标题】从文件中读取元组列表/将数据保存到文件【英文标题】:Reading list of tuples from a file/saving data to a file 【发布时间】:2021-10-25 20:36:37 【问题描述】:

我有一个给定学生学期的课程列表。我想将此类列表保存到名为 classes.txt 的 txt 文件中。这充当一种“保存”文件。再次打开时,程序将读取文件并知道学生正在上课。

我使用以下代码:

def write_out():
    f_out = open('classes.txt', 'w')

# classes is a list of classes that the student has created
# all the classes are objects which have a few parameters listed below
    for course in classes:
        f_out.write(str(Course.course_name(course)) + ',' +   str(Course.credits(course)) + ',' + str() + ',' + str(Course.assignments(course)) + '\n')

写入文件的内容如下:

Bio,4,[('exam', 100)],[]
calc,4,[('exam', 50)],[]

Course 对象由几个参数定义:

    名称(即“生物”) 学分数 课程评分类别的元组列表(类别名称,然后是权重) 作业清单*

*作业列表是作业对象的列表,由名称、类别和等级定义

我选择将类别保留为元组,因为它看起来更容易。


当我在程序启动时尝试读取文件时出现了我的问题。虽然将分配和类别写入列表相对简单,但读回它变得更加困难,因为当我将元组列表转换回例如类别时,似乎有双引号。

我的问题是:如何更轻松地将 txt 文件中的元组和列表读入我的程序中?

我从阅读此 post 开始,但我遇到了死胡同,因为这篇文章更多的是关于将元组专门保存到文件中,而我有很多参数需要在启动程序时转换为对象。

我想扩大这篇文章的范围,以便更多地了解保存文件,以便更好地了解我应该如何解决这个问题。

读取文件后,我根据保存文件中的参数创建一个新的 Course 对象,并将其添加到名为“课程”的列表中,以后可以访问。

旁注: 我什至不确定这种方法是否是最有效的做事方式,所以如果有人对如何更有效地将课程保存到文件有更好的想法,那么我会 100% 接受它。我计划将大量课程和作业写入此文件,因此正确写入很重要

感谢您的帮助,这是我在学习路径早期开始的一个项目,所以我只想重新审视它以了解如何将数据保存到文件中:p

【问题讨论】:

使用pickle 将整个列表保存到文件中。 您可能希望使用 Python csv module 正确保存和读取文件。它会为您充分转义所有特殊字符。 【参考方案1】:

我将为您提供一个 DIY 解决方案,无需外部库,让您了解工作流程。 cmets 中给出的建议比较好,但下划线的原则应该是“相似的”。

此处考虑性能、安全性,将其视为您学习路径的编码更新(或者我希望如此)。

要求

    在写入文件时使用唯一的分隔符,当您稍后阅读它时会更容易。我选择;,但可以随意更改(, 与列表发生冲突,& co) 在编写字符串对象时“双双”引用它们,以便在文件中它们将被双引号包围(eval 需要,请参阅下一步),因此字符串应采用'"Bio"' 的形式 使用eval 将字符串“复活”为对象 在课程类中添加写/读方法。特别是,reader 是一个类方法,因为它返回一个类实例
class Course:
    
    SEP = ';' # should be a unique character(s) 
    
    def __init__(self, name, credits_, grading_cats, assignments):
        self.name, self.credits, self.grading_cats, self.assignments = self.data = name, credits_, grading_cats, assignments

    def __str__(self): # not needed but useful to understand the difference with "write_file_formatter", see 2.
        return f'self.SEP'.join( str(i) for i in self.data)

    def write_file_formatter(self):
        return f'self.SEP'.join( f'"i"' if isinstance(i, str) else str(i) for i in self.data)

    @classmethod
    def read_file_formatter(cls, course_string):
        return cls(*map(eval, course_string.split(cls.SEP)))

# the courses        
c1 = Course('Bio', 4, [('exam', 100)], [])
c2 = Course('cal', 4, [('exam', 50)], [])

print(c1.write_file_formatter())
# "Bio";4;[('exam', 100)];[]
print(c2.write_file_formatter())
# "cal";4;[('exam', 50)];[]

# simulate text file
courses_from_file = c1.write_file_formatter() + '\n' + c2.write_file_formatter() 
# "Bio";4;[('exam', 100)];[]
# "cal";4;[('exam', 50)];[] 

# simulate read from file
for course in courses_from_file.split('\n'):
    c = Course.read_file_formatter(course)
    print(type(c), c)

# <class '__main__.Course'> Bio;4;[('exam', 100)];[]
# <class '__main__.Course'> cal;4;[('exam', 50)];[]

【讨论】:

以上是关于从文件中读取元组列表/将数据保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

怎么读取列表控件中的数据

每次读取文件与保存到核心数据

如何将各种尺寸的数组的Python列表保存到mat文件[重复]

将类对象列表保存到 JSON 文件中,以便以后读取

Python 2.7 MySQLdb将从数据库读取的最后一行保存到文本文件中

Opencv:当使用运算符<<保存为原始数据时,将数据从文件读取到矩阵