UnicodeEncodeError при использовании set_dataframe - PullRequest
1 голос
/ 20 апреля 2019

При использовании set_dataframe для обновления моих листов Google с помощью pygsheets и pandas я получаю сообщение об ошибке:

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xf1' в позиции 13: порядковый номер не в диапазоне (128)

Это связано с utf-8 отметками над текстом, например: "señor"

Это происходит при выполнении:

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

Панды to_csv принимает параметр кодирования, аналогичный encoding="utf-8", могу ли я предложить set_dataframe тоже самое?

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

Я вижу, что билет открыт 10 дней назад здесь но есть ли обходной путь?

1 Ответ

0 голосов
/ 19 июля 2019

Решение:

Я столкнулся с той же проблемой, и думаю, что это не просто ошибка в модуле 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')

Пояснение:

Вы решаете проблему, кодируя значения unicode самостоятельно, прежде чем отправлять их в функцию set_dataframe.

Эта проблема возникает, когда вы пытаетесь использовать функцию Worksheet.set_dataframe , используя фрейм данных, содержащий символы Юникода, которые не могут быть закодированы в ascii (например, ударения и многие другие).

Исключение выдается, потому что функция set_dataframe пытается преобразовать значения unicode в значения str (используя кодировку по умолчанию). Для Python 2 кодировкой по умолчанию является ascii, а при обнаружении символа вне диапазона ascii выдается исключение.

Некоторые люди предлагают перезагрузить модуль sys , чтобы обойти эту проблему, но здесь объясняется, почему вы не должны это делать

Другое решение, о котором я бы подумал, - это использовать модуль pygsheets в Python 3, где это больше не должно быть проблемой, поскольку кодировка по умолчанию для Python 3 - UTF-8 ( см. Документы )

Бонус:

Задайте себе вопрос:
1) Unicode - это кодировка?
2) Что такое кодировка?

Если вы сомневались в любом из этих вопросов, вам следует прочитать эту статью , которая дала мне знания, необходимые для обдумывания этого решения. Затраченное время того стоило.

Для получения дополнительной информации вы можете попробовать эту статью , которая в конце ссылается на предыдущую.

...