1

使用set_dataframe和 更新我的 Google 表格时pygsheetspandas出现错误:

UnicodeEncodeError:“ascii”编解码器无法在位置 13 编码字符 u'\xf1':序数不在范围内(128)

这是由于utf-8某些文本上的标记,例如:“señor”

这发生在执行:

wks.set_dataframe(df, start='A10')

Pandasto_csv接受类似于的编码参数encoding="utf-8",我可以建议set_dataframe这样做吗?

wks.set_dataframe(df, start='A10', encoding="utf-8")

我看到这里有一张 10 天前开的票但有解决方法吗?

4

1 回答 1

0

解决方案:

我遇到了同样的问题,我认为,这不仅仅是 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避免此问题而进行了更改。请参阅下面的编辑部分

说明:在将值发送到函数之前,

您可以通过自己对值进行编码来解决问题。unicodeset_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
于 2019-07-19T17:58:20.987 回答