用python中的变量打开等价物

时间:2017-06-17 11:12:31

标签: python pandas

我正在处理大量内存消耗数据集,并想知道是否有任何等效的

with open('file.txt','rb') as f:
    print f.read()
    #<more possible code on f>

打开with上下文中的文件,稍后在常规变量中关闭它,特别是在pandas中。

我希望以下代码能够进行计算并从内存中转储数据帧df

with pd.read_csv('data.csv') as df:
    print df.head()
    #<do calculations of df>

有没有相应的解决方案?

1 个答案:

答案 0 :(得分:2)

以下可能不是获得所需内容的最优雅方式(假设这可以在pandas内实现),但我相信它可以完成工作。它试图做的是创建一个名为DFrameManager的类,其主要存在是提供__enter____exit__方法。这些方法碰巧是with_statement工作的原因。该类将具有属性df,这是您要导入的数据帧。此外,__enter__将返回self;虽然__exit__有一项工作:删除数据框(self.df)。这意味着您可以对with_statement内的数据框执行任何操作。一旦您离开with_statement__exit__方法将为您删除数据帧。

以下应该是一个不错的起点:

import pandas as pd
import os


class DFrameManager:
    def __init__(self, file_path):
        file_extension = os.path.splitext(file_path)[-1].lower()
        if 'xls' in file_extension:
            self.df = pd.read_excel(file_path)
        elif 'txt' in file_extension:
            self.df = pd.read_table(file_path)
        elif 'csv' in file_extension:
            self.df = pd.read_csv(file_path)
        else:
            raise NotImplementedError("File types other than xls, xlsx, txt and csv need to be implemented first")
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        del self.df


with DFrameManager("data.csv") as manager:
    print(manager.df.head(1))

这只打印数据帧的第一行,但可能性是无穷无尽的。

如果我尝试访问数据框,我会收到AttributeError

print(manager.df)

返回

  

AttributeError:DFrameManager实例没有属性'df'

这实际上意味着,只要退出with_statement,就不应再将该数据帧存储在内存中。当__exit__方法调用del self.df时,垃圾收集器会处理它。

我希望这会有所帮助。