代码之家  ›  专栏  ›  技术社区  ›  user3871

pygsheets unicodeencodeer在使用set_dataframe时出错

  •  0
  • user3871  · 技术社区  · 5 年前

    使用时 set_dataframe 通过 pygsheets pandas ,我得到错误:

    unicodeencodeerror:“ascii”编解码器无法对位置13中的字符u“\xf1”进行编码:序号不在范围(128)内

    这是因为 utf-8 在某些文本上标记,例如:“Se_”或

    这发生在执行:

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

    熊猫 to_csv 接受类似于 encoding="utf-8" ,我可以建议 设置数据帧 也一样吗?

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

    我看到有张10天前开的票 here 但有办法吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   alejandro    5 年前

    解决方案:

    我遇到了同样的问题,而且我认为,这不仅仅是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