我正在处理大量内存消耗数据集,并想知道是否有任何等效的
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>
有没有相应的解决方案?
答案 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
时,垃圾收集器会处理它。
我希望这会有所帮助。