以下可能不是獲得你想要的最優雅的方式(因爲這可能在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
時,垃圾收集器處理它。
我希望這會有所幫助。
嘗試執行以下搜索:https://www.google.cn/context+manager&oq=python+pandas+context+manager&aqs=chrome..69i57.10475j0j7&sourceid=chrome&ie = UTF-8 – boardrider