gpt4 book ai didi

python-3.x - 继承和 Pandas

转载 作者:行者123 更新时间:2023-12-01 02:41:59 31 4
gpt4 key购买 nike

我正在尝试创建一个基于 Pandas 的 ExcelWriter 的文件编写器。我像往常一样处理 Python (3) 中的继承类:

import pandas as pd

class Writer(pd.ExcelWriter):
def __init__(self, fname, engine='openpyxl'):
pd.ExcelWriter.__init__(self, fname, engine=engine)
self.newvar = 0

但是,当我尝试使用它时,我无法访问 newvar:

test = Writer('test.xlsx')
test.newvar

返回:

AttributeError: '_XlsxWriter' object has no attribute 'nmax'

当我检查 test 的类型时,它返回:

pandas.io.excel._XlsxWriter  

我不明白我错过了什么,因为我在许多其他情况下使用了这种继承。任何想法将不胜感激!

最佳答案

这是因为pandas.ExcelWriter.__new__返回一个不同于自身的类(实际上它是一个 abc.ABCMeta )。该类是根据文件路径的扩展名和使用的引擎来选择的——您可以在检查新创建的实例的类型时观察到这一点。这意味着调用返回的任何类的 __init__ 方法。您可以将 ExcelWriter 视为每种格式和引擎的特定编写器的某种代理(尽管它还定义了此类编写器必须提供的 API)。

为了使您的编写器可用(对于给定的引擎),您需要 register

但在此之前,您需要按照通过 help(pandas.ExcelWriter) 找到的说明使您的类兼容。 .为了完整起见,我在这里引用它们:

# Defining an ExcelWriter implementation (see abstract methods for more...)

# - Mandatory
# - ``write_cells(self, cells, sheet_name=None, startrow=0, startcol=0)``
# --> called to write additional DataFrames to disk
# - ``supported_extensions`` (tuple of supported extensions), used to
# check that engine supports the given extension.
# - ``engine`` - string that gives the engine name. Necessary to
# instantiate class directly and bypass ``ExcelWriterMeta`` engine
# lookup.
# - ``save(self)`` --> called to save file to disk
# - Mostly mandatory (i.e. should at least exist)
# - book, cur_sheet, path

# - Optional:
# - ``__init__(self, path, engine=None, **kwargs)`` --> always called
# with path as first argument.

考虑到这一点,我们可以扩展您的类(class):

class Writer(pd.ExcelWriter):
engine = 'openpyxl'
supported_extensions = ('xlsx',)

def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
# Implement something useful here.
pass

def save(self):
# Implement something useful here.
pass

def __init__(self, fname, engine='openpyxl', **kwargs):
super().__init__(self, fname, engine=engine, **kwargs)

现在您可以使用 pd.io.excel.register_writer(Writer) 来注册 writer。但是您需要确保您指定的引擎与您的 openpyxl 版本相匹配。您可以查看如何选择特定作者的过程here ;可以通过print(pd.io.excel._writers)查看当前为每个版本注册的作者。

作为旁注:您还可以子类化一个已经可用的特定编写器并重用它们的 write_cellssave 方法(例如,您需要注册你的作家也在那种情况下):

关于python-3.x - 继承和 Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46545846/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com