Python-读取文件并以分号分隔行的最佳方法

发布于 2021-01-29 16:12:21

读取文件并以分号分隔行的最佳方法是什么。返回的数据应该是一个元组列表。

可以打败这种方法吗?可以这样做更快/使用更少的内存吗?

def readfile(filepath, delim):
    with open(filepath, 'r') as f:
        return [tuple(line.split(delim)) for line in f]
关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您发布的代码读取整个文件,并在内存中构建文件的副本,将其作为所有文件内容的单个列表,并分为多个元组,每行一个元组。由于您询问如何使用更少的内存,因此您可能只需要一个生成器函数:

    def readfile(filepath, delim): 
        with open(filepath, 'r') as f: 
            for line in f:
                yield tuple(line.split(delim))
    

    但!有一个重大警告!您只能对readfile返回的元组进行一次迭代。

    lines_as_tuples = readfile(mydata,','):
    
    for linedata in lines_as_tuples:
        # do something
    

    到目前为止还可以,并且生成器和列表看起来相同。但是,假设您的文件将包含许多浮点数,并且您对该文件的迭代计算出了这些数字的总体平均值。您可以使用“#做某事”代码来计算总和和数量,然后计算平均值。但是,现在让我们说您想再次进行迭代,这次是从每个值的平均值中找出差异。您可能会想再添加一个for循环:

    for linedata in lines_as_tuples:
        # do another thing
        # BUT - this loop never does anything because lines_as_tuples has been consumed!
    

    AM!这是生成器和列表之间的很大差异。现在,在代码中,生成器已被完全消耗掉了-但是没有引发任何特殊异常,for循环只是不执行任何操作,然后继续静默运行!

    在许多情况下,您将返回的列表仅重复一次,在这种情况下,将readfile转换为生成器就可以了。但是,如果您想要的是一个更持久的列表,您将访问该列表多次,那么仅使用生成器会给您带来问题,因为您只能迭代生成器一次。

    我的建议?使readlines成为一个生成器,以便在其自己的世界观中,它仅产生文件的每个增量位,既美观又节省内存。将保留数据的负担放在调用方上-
    如果调用方需要多次引用返回的数据,则调用方可以简单地从生成器构建自己的列表-使用Python轻松完成list(readfile('file.dat', ','))



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看