解决方案:
我遇到了同样的问题,而且我认为,这不仅仅是pygsheets模块中的一个bug,正如您明确指出的那样,也是一个限制。
我解决这个问题的方法是:
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
function
,使用的数据帧包含不能用ascii编码的unicode字符(如重音符号等)。
引发异常的原因是
设置数据帧
函数尝试将
统一码
价值转化为
str
值(使用默认编码)。对于python 2,默认编码是
ascii
当一个角色超出
ASCII
如果找到,则引发异常。
有人建议
reloading the sys module
为了规避这个问题,但是
here
解释了为什么你不应该这么做
我想的另一个解决方案是在python 3中使用pygsheets模块,在这里这不再是问题,因为python3的默认编码是utf-8(
see docs
)
奖金:
扪心自问:
1)Unicode是一种编码吗?
2)什么是编码?
如果你对这些问题犹豫不决,你应该读
this article
,这给了我思考这个解决方案所需的知识。投入的时间是完全值得的。
有关详细信息,您可以尝试
this article
链接到最后一个。
编辑:
一
change
于2天前(19年7月26日)向
皮片
应该可以解决这个问题的。看起来目的是避免编码到
STR
类型,但我认为此更改可能会尝试将字符串解码为
统一码
从默认的ascii编码中键入,这也可能导致问题。当/如果发布此更改时,最好不要对任何内容进行编码,并将值作为unicode传递给
设置数据帧
功能。
编辑2:
此更改现在已在版本中发布
2.0.2
. 如果我的预测是真的,用
encodeDataFrame
我建议的功能将导致
UnicodeDecodeError
因为
工作表.set_dataframe
函数将尝试解码
STR
默认值
ASCII
编码.所以使用函数的最好方法是
STR
数据帧中的值。如果你有,把它们解码成
统一码
在打电话给
设置数据帧
功能。你可以有一个镜像版本的
我建议的功能。它看起来像这样:
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