gpt4 book ai didi

python - 使自定义类 xlsxwriter 友好

转载 作者:行者123 更新时间:2023-11-28 22:46:21 26 4
gpt4 key购买 nike

我正在用 pandas 编写一些数据分析管道。我一直在使用的数据框中的一列是由自定义编写的类的对象组成的,每个类都用一个字符串初始化,我用正则表达式从中读取各种信息并存储在对象的属性中。子类结构类似于实现生命树的方式(例如,Tiger 是 Cat 的子类,而 Cat 是 Animal 的子类,并且经常(但并非总是)具有相同父类(super class)的动物将共享方法)。它也有一些有用的方法,我可以用它来进行计算。对于 strrepr 方法返回用于初始化它的字符串,如下所示:

class Animal(object):

def __init__(self, name):
self.name = name
self.group = self.__class__.__name__

def __repr__(self):
return self.name.__repr__()

def __str__(self):
return self.name.__str__()

我正在使用这段代码将数据框字典写入 excel 电子表格:

        with pd.ExcelWriter(saveas) as writer:
for key, val in dictionary.items():
print key
write_index = not val.data_frame.index.is_integer()
val.to_excel(writer, sheet_name=key, index=write_index)
writer.save()

这意味着当我想查看我的数据框时,我会看到一个字符串。我在包含这些对象的数据帧上使用 to_csv() 方法没有遇到任何问题,但是当我使用 pandas 数据帧的 to_excel() 方法时,出现以下错误:

  File "C:\Users\Mike\Anaconda\lib\site-packages\xlsxwriter\worksheet.py", line 406, in write
f = float(token)

TypeError: float() argument must be a string or a number

所以我追踪到 worksheet.py 中的代码,违规行如下所示:

    try:
f = float(token) ##THIS IS WHERE THE CODE FAILS
if not self._isnan(f) and not self._isinf(f):
return self.write_number(row, col, f, *args[1:])
except ValueError:
pass

# Finally try string.
try:
str(token)
return self.write_string(row, col, *args)
except ValueError:
raise TypeError("Unsupported type %s in write()" % type(token))

我在上面的代码中添加了注释以显示失败发生的位置。我的对象没有 float 方法,因此它们抛出的不是 ValueError,而是 TypeErrors。从上面的代码可以看出,如果我们可以传递到第二个 try 语句,那么写入就会开始(因为我的类有一个 str 方法)。因此,我为我的自定义类提供了一个float 方法,该方法返回一个 ValueError 以便可以触发 except 子句。

但是,xlsx writer 存在更多问题,一些类似的问题与我的类中缺少某些方法有关(我在每种情况下都添加了这些方法)。然而,这只会延迟问题:

  File "C:\Users\Mike\Anaconda\lib\site-packages\xlsxwriter\sharedstrings.py", line 95, in _write_si
string = re.sub('(_x[0-9a-fA-F]{4}_)', r'_x005F\1', string)

现在,这里的问题(我查看了代码)是,一旦将字符串写入工作表,xlsxwriter 就会运行一些函数,从写入的文件中获取所有字符串。问题似乎是一旦工作表被写入(writer.save() 之前的所有内容都没有错误地通过),xlsxwriter 假设写入的字符串一直都是字符串,并像对待它们一样对待它们,而不是将它们封装在str() 的功能和以前一样。

现在,我可以去修改有问题的代码,但我不想通过更新 xlsxwriter 来处理让它正常运行的问题。我可以简单地让我的类继承自 str,但考虑到我真的不想使用几乎任何字符串方法,这似乎是非 pythonic 的。最后,我可以通过获取该子类中的所有内容并将其转回字符串来清理我的数据框,但这意味着我必须重写我使用的很多东西,这些东西取决于能够使用 DataFrame.to_excel方法。有什么我可以在类中做的,使我不必从 str 继承所有内容吗?

最佳答案

最简单的方法可能就是实现你自己的引擎来使用

from pandas import io
class MyXLSWriter(io.excel.xlsx.writer):
def write_cells(self, cells,*args,**kwargs):
for cell in cells:
if isinstance(cell.val,(MyCustomClass1,MyCustomClassN)):
cell.val = str(cell.val) #or some other representaion...
io.excel.xlsx.writer.write_cells(self,cells,*args,**kwargs)

my_df.to_excell(fname,engine=MyXLSWriter)

我觉得至少...我完全没测试过...

关于python - 使自定义类 xlsxwriter 友好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27556502/

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