2017-06-17 45 views
0

我沉重的內存消耗的數據集,難怪工作,如果有任何等同於開放相當於變量在python

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

嘗試執行以下搜索:https://www.google.cn/context+manager&oq=python+pandas+context+manager&aqs=chrome..69i57.10475j0j7&sourceid=chrome&ie = UTF-8 – boardrider

回答

1

以下可能不是獲得你想要的最優雅的方式(因爲這可能在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 instance has no attribute 'df'

這在本質上,這意味着你不應該在內存中數據幀了,只要你退出with_statement。當__exit__方法調用del self.df時,垃圾收集器處理它。

我希望這會有所幫助。