解决方案:
我遇到了同样的问题,我认为,这不仅仅是 pygsheets 模块中的一个错误,而且正如您明确指出的那样,这将是一个限制。
我为解决这个问题所做的是:
def encodeDataFrame(df, encoding='UTF-8'):
if df is not None and not df.empty:
for column, series in df.items():
if type(series.at[0]) == unicode:
try:
encodedSeries = series.str.encode(encoding)
df[column] = encodedSeries
except Exception as e:
print 'Could not encode column %s' % column
raise
你可以这样调用函数:
encodeDataFrame(df)
wks.set_dataframe(df, start='A10')
这可能不再是一个好的解决方案,因为为pygsheets
避免此问题而进行了更改。请参阅下面的编辑部分
说明:在将值发送到函数之前,
您可以通过自己对值进行编码来解决问题。unicode
set_dataframe
每当您尝试使用该Worksheet.set_dataframe
函数时,就会出现此问题,使用的数据帧包含无法以 ascii 编码的 unicode 字符(如重音符号等)。
抛出异常是因为set_dataframe
函数尝试将unicode
值转换为str
值(使用默认编码)。对于 Python 2,默认编码是ascii
,当找到超出范围的字符时,ascii
抛出异常。
有人建议重新加载 sys 模块来规避这个问题,但这里解释了为什么你不应该这样做
我会想到的另一个解决方案是在 Python 3 中使用 pygsheets 模块,这应该不再是问题,因为 Python 3 的默认编码是 UTF-8(请参阅文档)
奖励:
问问自己:
1) Unicode 是一种编码吗?
2)什么是编码?
如果您对这些问题中的任何一个犹豫不决,您应该阅读这篇文章,它为我提供了思考此解决方案所需的知识。投入的时间是完全值得的。
有关更多信息,您可以尝试这篇文章,该文章最后链接到上一篇。
编辑: 2 天前(07/26/19)进行了更改
,应该pygsheets
可以解决此问题。看起来目的是避免编码为str
类型,但我认为此更改可能会尝试将字符串unicode
从默认的 ascii 编码解码为类型,这也可能导致麻烦。当/如果发布此更改时,最好不要对任何内容进行编码并将值作为 unicode 传递给set_dataframe
函数。
编辑 2:
此更改现已在 version 中发布2.0.2
。如果我的预测是正确的,使用encodeDataFrame
我建议的函数将导致 a UnicodeDecodeError
,因为该Worksheet.set_dataframe
函数将尝试str
使用默认ascii
编码解码值。因此,使用该函数的最佳方法是str
在您的数据框中不包含任何值。如果你有它们,unicode
在调用set_dataframe
函数之前将它们解码。您可以拥有我建议的功能的镜像版本。它看起来像这样:
def decodeDataFrame(df, encoding='UTF-8'):
if df is not None and not df.empty:
for column, series in df.items():
if type(series.at[0]) == str:
try:
decodedSeries = series.str.decode(encoding)
df[column] = decodedSeries
except Exception as e:
print 'Could not decode column %s' % column
raise