Если ваш API требует кодирования в GBK, просто кодируйте в этот кодек, используя обработчик ошибок, отличный от 'strict'
(по умолчанию).
'ignore'
отбрасывает любые кодовые точки, которые не могут быть закодированыв GBK:
dfs['ssentence_encoded'] = dfs['ssentence'].str.encode('gbk', 'ignore')
См. Обработчики ошибок в документации Python codecs
.
Если вам нужно передать строки,но только строки, которые можно безопасно кодировать в GBK, тогда я бы создал карту перевода, подходящую для str.translate()
метода :
class InvalidForEncodingMap(dict):
def __init__(self, encoding):
self._encoding = encoding
self._negative = set()
def __missing__(self, codepoint):
if codepoint in self._negative:
raise LookupError(codepoint)
if chr(codepoint).encode(self._encoding, 'ignore'):
# can be mapped, record as a negative and raise
self._negative.add(codepoint)
raise LookupError(codepoint)
# map to None to remove
self[codepoint] = None
return None
only_gbk = InvalidForEncodingMap('gbk')
dfs['ssentence_gbk_safe'] = dfs['sentence'].str.translate(only_gbk)
Класс InvalidForEncodingMap
лениво создает записипри поиске кодовых точек обрабатываются только те кодовые точки, которые действительно присутствуют в ваших данных.Я бы по-прежнему держал экземпляр карты для повторного использования, если вам нужно использовать его более одного раза, кэш, который он создает, можно использовать таким образом.