Ошибка записи данных в формате PySpark (данные MovieLens) [дубликат]

он работал для меня на 000webhost, выполнив следующие действия:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n"; 

Введите адрес электронной почты при отправке электронной почты

mail('email@gmail.com', $subject, $message, $headers)

Используйте '', а не ""

Этот код работает, но письмо было получено с задержкой в ​​полчаса

1000
задан ShaneB 22 March 2016 в 14:59
поделиться

20 ответов

Вам нужно прочитать Python Unicode HOWTO . Эта ошибка является самым первым примером .

В принципе, прекратите использование str для преобразования из Юникода в кодированный текст / байты.

Вместо этого правильно используйте .encode() для кодирования строки:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

или полностью работать в юникоде.

1059
ответ дан agf 21 August 2018 в 01:32
поделиться
  • 1
    согласовано! хорошее правило, которым меня учили, - использовать «юникодный сэндвич». идея. Ваш скрипт принимает байты из внешнего мира, но вся обработка должна выполняться в Юникоде. Только тогда, когда вы будете готовы выводить свои данные, если их нужно перевести в байты! – Andbdrew 30 March 2012 в 13:29
  • 2
    В случае, если кто-то еще запутался в этом, я обнаружил странную вещь: мой терминал использует utf-8, а когда я print, мои строки utf-8 работают хорошо. Однако, когда я передаю свои программы в файл, он выбрасывает UnicodeEncodeError. Фактически, когда выход перенаправляется (в файл или канал), я обнаружил, что sys.stdout.encoding - None! Решение проблемы .encode('utf-8') решает проблему. – drevicko 18 December 2012 в 10:15
  • 3
    @drevicko: используйте PYTHONIOENCODING=utf-8, а не печатайте строки Unicode и позволяйте среде устанавливать ожидаемую кодировку. – jfs 21 December 2013 в 05:51
  • 4
    Это плохой и запутанный совет. Причина, по которой люди используют str, состоит в том, что объект НЕ является уже строкой, поэтому нет метода .encode() для вызова. – Cerin 5 October 2016 в 17:59
  • 5
    @Praxiteles Нет, это не так. Он был просто скопирован из исходного кода, например, имени соединения и имени переменной. Это нечто специфическое для его использования. – agf 28 April 2017 в 20:45

Это классическая точка болида unicode python! Рассмотрим следующее:

a = u'bats\u00E0'
print a
 => batsà

Все хорошо до сих пор, но если мы назовем str (a), посмотрим, что получится:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

О, падайте, это не собирается любой хороший! Чтобы исправить ошибку, явным образом закодируйте байты с помощью .encode и скажите python, какой кодек использовать:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

Проблема в том, что при вызове str ( ), python использует кодировку символов по умолчанию, чтобы попытаться и закодировать байты, которые вы ему дали, что в вашем случае иногда представляет символы юникода. Чтобы устранить проблему, вы должны сказать python, как обращаться со строкой, которую вы даете ей, используя .encode ('whatever_unicode').

Для отличной экспозиции по этой теме см. Раздел PyCon от Ned Batchelder: http://nedbatchelder.com/text/unipain .html

371
ответ дан Andbdrew 21 August 2018 в 01:32
поделиться
  • 1
    Личное примечание: при попытке ввести «.encode» не случайно введите «.unicode» то удивляйтесь, почему ничего не работает. – Skip Huffman 24 December 2012 в 16:38
  • 2
    Хороший совет. Но что вы делаете, когда используете str (x) для печати объектов, которые могут быть или не быть строками? str (x) работает, если x - число, дата, логическая или нормальная строка. Внезапно, если его unicode перестанет работать. Есть ли способ получить такое же поведение или нам нужно добавить проверку IF, чтобы проверить, является ли объект строкой для использования .encode и str () в противном случае? – Dirk R 25 January 2018 в 17:50

Добавьте строку ниже в начале вашего скрипта (или в качестве второй строки):

# -*- coding: utf-8 -*-

Это определение кодировки исходного кода python. Дополнительная информация в PEP 263 .

16
ответ дан Andriy Ivaneyko 21 August 2018 в 01:32
поделиться

Для меня работала:

BeautifulSoup(html_text,from_encoding="utf-8")

Надеюсь, это кому-то поможет.

24
ответ дан Animesh 21 August 2018 в 01:32
поделиться

Ниже решения работало для меня, Просто добавлено

u "String"

(представляющее строку как unicode) перед моей строкой.

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)
2
ответ дан Aravind Krishnakumar 21 August 2018 в 01:32
поделиться

ну, я все испробовал, но это не помогло, после того, как я разобрался, я понял следующее, и это помогло. используется python 2.7.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
112
ответ дан Ashwin 21 August 2018 в 01:32
поделиться
  • 1
    Не делай этого. stackoverflow.com/questions/3828723/… , хотя, когда у вас есть такие ответы, как stackoverflow.com/a/31137935/2141635 в верхней части результатов при поиске для ошибки я могу понять, почему это может показаться хорошей идеей. – Padraic Cunningham 8 September 2016 в 11:50
  • 2
    Я попробовал почти все предложения в этой теме, и на самом деле никто не работал для меня. Наконец я попробовал это. И это действительно ТОЛЬКО одно, что сработало просто и хорошо. Если кто-то скажет «Не делайте этого, тогда придите с простым решением. В противном случае используйте это. Потому что это хорошая рабочая копия и прошлое решение. – Richard 24 August 2017 в 11:48
  • 3
    Это решение работает с файлом file.write (), а также с print (). – Jacob Quisenberry 1 December 2017 в 18:47
  • 4
    Как это можно сделать в python3? Был бы рад узнать. – Kanerva Peter 7 March 2018 в 13:24
  • 5
    – Avraham Zhurba 17 June 2018 в 21:47
  • 6
    Не делай этого! Если вы это сделаете, вы можете избежать heaps тайного знания Python2 и unicode! Ужас! – Prof. Falken 15 July 2018 в 13:38

Вот переименование некоторых других так называемых ответов «cop out». Бывают ситуации, когда простое отбрасывание неприятных символов / строк является хорошим решением, несмотря на протесты, озвученные здесь.

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

Тестирование:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

Результаты:

1
test
98°
98

Предложение: вместо этого вы можете назвать эту функцию toAscii? Это вопрос предпочтения.

10
ответ дан BuvinJ 21 August 2018 в 01:32
поделиться

Я просто использовал следующее:

import unicodedata
message = unicodedata.normalize("NFKD", message)

Проверьте, что в документации говорится об этом:

unicodedata.normalize (form, unistr) Возвращает форму нормальной формы для Unistode string unistr. Допустимыми значениями для формы являются «NFC», «NFKC», «NFD» и «NFKD».

Стандарт Unicode определяет различные формы нормализации строки Unicode на основе определения канонической эквивалентности и совместимости эквивалентность. В Unicode несколько символов могут быть выражены различными способами. Например, символ U + 00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) также может быть выражен как последовательность U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (КОМБИНИРОВАНИЕ CEDILLA).

Для каждого символа , существуют две нормальные формы: нормальная форма C и нормальная форма D. Нормальная форма D (NFD) также известна как каноническое разложение и переводит каждый символ в его разложенную форму. Нормальная форма C (NFC) сначала применяет каноническое разложение, а затем снова складывает предварительно комбинированные символы.

В дополнение к этим двум формам существуют две дополнительные нормальные формы, основанные на эквивалентности эквивалентности. В Unicode поддерживаются определенные символы, которые обычно объединяются с другими символами. Например, U + 2160 (ROMAN NUMERAL ONE) на самом деле то же самое, что и U + 0049 (LATIN CAPITAL LETTER I). Тем не менее, он поддерживается в Unicode для совместимости с существующими наборами символов (например, gb2312).

Нормальная форма KD (NFKD) применит декомпозицию совместимости, то есть заменит все символы совместимости на их эквиваленты. Нормальная форма KC (NFKC) сначала применяет декомпозицию совместимости, за которой следует каноническая композиция.

Даже если две строки Юникода нормированы и выглядят одинаково для читателя человека, если у вас есть сочетание символов, а другое не может сравниться с равными.

Решает его для меня. Простой и легкий.

3
ответ дан Drag0 21 August 2018 в 01:32
поделиться

Я нашел элегантную работу для меня, чтобы удалить символы и продолжать держать строку в виде строки следующим образом:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

Важно заметить, что использование опции ignore опасно, поскольку она беззвучно удаляет любой юникод (и интернационализации) от кода, который его использует, как показано здесь (конвертировать unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
167
ответ дан Edeson Bizerril 21 August 2018 в 01:32
поделиться
  • 1
    Вы сделали мой день! Для utf-8 этого достаточно: yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8') – luca76 14 February 2017 в 16:38
  • 2
    для меня это работало, но мой случай был другим, я сохранял имена файлов и имел & quot; / & quot; в имени и пути не существовало, поэтому я должен использовать .replace (& quot; / & quot ;, & quot; & quot;) и, таким образом, сохранить мой сценарий. в то время как игнорирование ascii также работает и для случая «utf-8». – harrypotter0 5 July 2018 в 08:38
  • 3
    – login_not_failed 22 August 2018 в 07:36

Мы допустили эту ошибку при запуске manage.py migrate в Django с локализованными приборами.

Наш источник содержал объявление # -*- coding: utf-8 -*-, MySQL была правильно настроена для utf8, а Ubuntu располагал соответствующим языковым пакетом и значениями в /etc/default/locale.

Проблема заключалась в том, что в контейнере Django (мы используем докер) отсутствовала LANG env var.

Установка LANG на en_US.UTF-8 и перезапуск контейнер перед повторным запуском миграции исправил проблему.

1
ответ дан followben 21 August 2018 в 01:32
поделиться

Если у вас есть что-то вроде packet_data = "This is data", сделайте это на следующей строке, сразу после инициализации packet_data:

unic = u''
packet_data = unic
0
ответ дан halfer 21 August 2018 в 01:32
поделиться

Попробуйте это, возможно,

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
4
ответ дан Joseph Daudi 21 August 2018 в 01:32
поделиться

Просто добавьте переменную encode ('utf-8')

agent_contact.encode('utf-8')
2
ответ дан Kairat Koibagarov 21 August 2018 в 01:32
поделиться

Проблема в том, что вы пытаетесь напечатать символ юникода, но ваш терминал не поддерживает его.

Вы можете попробовать установить пакет language-pack-en, чтобы исправить это:

sudo apt-get install language-pack-en

, который обеспечивает обновление данных перевода на английском языке для всех поддерживаемых пакетов (включая Python). При необходимости установите другой языковой пакет (в зависимости от того, какие символы вы пытаетесь распечатать).

В некоторых дистрибутивах Linux это необходимо, чтобы убедиться, что локальные английские локали установлены правильно (так что символы Unicode может обрабатываться оболочкой / терминалом). Иногда его проще установить, чем настраивать вручную.

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

Например:

open(foo, encoding='utf-8')

Если у вас все еще есть проблема, дважды проверьте конфигурацию вашей системы, например:

  • Ваш языковой файл (/etc/default/locale), который должен иметь, например,
    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"
    
  • Значение LANG / LC_CTYPE в оболочке.
  • Проверьте, какой язык поддерживает ваша оболочка:
    locale -a | grep "UTF-8"
    

Демонстрация проблемы и решения в новой виртуальной машине.

  1. Инициализация и предоставление виртуальной машины (например, с помощью vagrant ):
    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh
    
    Смотрите: доступные ящики Ubuntu ..
  2. Печать символов юникода (например, знак торговой марки как ):
    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
    
  3. Теперь установка language-pack-en:
    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
    
  4. Теперь проблема решена:
    $ python -c 'print(u"\u2122");'
    ™
    
14
ответ дан kenorb 21 August 2018 в 01:32
поделиться
  • 1
    Что language-pack-en связано с Python или этим вопросом? AFAIK, он может предоставлять языковые переводы сообщений, но не имеет никакого отношения к кодированию – Alastair McCormack 26 December 2015 в 11:47
  • 2
    В некоторых дистрибутивах Linux это необходимо, чтобы убедиться, что локальные английские локали установлены правильно, особенно при запуске сценария Python на терминале. Это сработало для меня в какой-то момент. См .: кодировка символа – kenorb 26 December 2015 в 12:00
  • 3
    Ах хорошо. Вы имеете в виду, если хотите использовать неанглийский язык? Думаю, пользователю также придется отредактировать /etc/locale.gen, чтобы убедиться, что их язык создан до его использования? – Alastair McCormack 26 December 2015 в 12:04
  • 4
    @AlastairMcCormack Прокомментировал LANG из /etc/default/locale (поскольку /etc/locale.gen не существует) и побежал locale-gen, но это не помогло. Я не уверен, что делает language-pack-en, так как я не нашел много документации и перечисление содержания этого не очень помогает. – kenorb 27 December 2015 в 14:07
  • 5
    маловероятно, что в настольной системе нет локалей utf-8, то есть, вероятно, вам не нужно ничего устанавливать, просто настройте LANG / LC_CTYPE / LC_ALL (например, LANG=C.UTF-8). – jfs 1 January 2016 в 04:10

Тонкая проблема, вызывающая потерю печати даже при неправильной настройке переменных среды, например. здесь LC_ALL установлен на «C». В Debian они препятствуют установке: Debian wiki в Locale

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà
73
ответ дан maxpolk 21 August 2018 в 01:32
поделиться
  • 1
    Получил точно такую ​​же проблему, так что плохо я не проверял ее перед сообщением . Большое спасибо. Кстати, вы можете заменить первые две команды на env|grep -E '(LC|LANG)'. – Dmitry Verhoturov 8 August 2015 в 07:28
  • 2
    – login_not_failed 22 August 2018 в 07:52

Простые вспомогательные функции найдены здесь здесь .

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')
6
ответ дан Parag Tyagi -morpheus- 21 August 2018 в 01:32
поделиться
  • 1
    Чтобы получить escape-последовательность (для преобразования произвольной строки Unicode в байты с использованием ascii-кодирования), вы можете использовать обработчик ошибок backslashreplace: u'\xa0'.encode('ascii', 'backslashreplace'). Хотя вы должны избегать такого представления и настраивать среду для принятия символов не-ascii - это 2016! – jfs 1 January 2016 в 04:05
  • 2
    С Новым Годом @ J.S.Sebastian. Я просто разочаровался в проблеме Python-Unicode, а затем, наконец, получил это решение, которое работало. Я не знал об этом. В любом случае спасибо за наконечник. – Parag Tyagi -morpheus- 1 January 2016 в 07:53

У меня просто была эта проблема, и Google привел меня сюда, так что просто чтобы добавить к общим решениям здесь, это то, что сработало для меня:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

У меня была эта идея после прочтения Презентация Неда .

Я не претендую на то, чтобы полностью понять, почему это работает. Поэтому, если кто-нибудь может отредактировать этот ответ или поставить комментарий, чтобы объяснить, я буду признателен.

1
ответ дан pepoluan 21 August 2018 в 01:32
поделиться
  • 1
    Что такое type значения? до и после этого? Я думаю, что так получается, что, выполняя unic += value, который является таким же, как unic = unic + value, вы добавляете строку и unicode, где python затем принимает unicode для результирующего unic, то есть более точного типа (подумайте о том, когда вы делаете это a = float(1) + int(1), a становится float), а затем value = unic указывает value на новый объект unic, который является unicode. – Tom Myddeltyn 24 May 2016 в 21:16

Я всегда ставил код ниже в первых двух строках файлов python:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
3
ответ дан Pereira 21 August 2018 в 01:32
поделиться

Я действительно обнаружил, что в большинстве моих случаев просто удаление этих символов намного проще:

s = mystring.decode('ascii', 'ignore')
27
ответ дан Phil LaNasa 21 August 2018 в 01:32
поделиться
  • 1
    & Quot; Прекрасно & Quot; обычно не выполняется. Он отбрасывает материал, который вы должны выяснить, как правильно работать. – tripleee 13 December 2014 в 17:53
  • 2
    просто удаляя "те & quot; (не английские) символы не являются решением, поскольку python должен поддерживать все языки, как вы думаете? – alemol 9 January 2015 в 20:47
  • 3
    Downvoted. Это совсем не правильное решение. Узнайте, как работать с Unicode: joelonsoftware.com/articles/Unicode.html – Andrew Ferrier 13 January 2015 в 14:04
  • 4
    Посмотрите, самый разумный способ представить этот ответ таким образом: узнав, что ascii предоставляет определенную привилегию определенным языкам и пользователям - это escape hatch , которые могут быть использованы для тех пользователей, которые могут взломать беглый, первый проход, сценарий вместе, возможно, для предварительной работы до полной поддержки юникода. – lol 19 June 2016 в 14:07
  • 5
    Если я пишу сценарий, который просто должен печатать текст на английском в stdout во внутреннем корпоративном приложении, я просто хочу, чтобы проблема исчезла. Что бы ни работало. – kagronick 11 May 2017 в 14:11

У меня была такая же проблема, и я смог изменить файл csv, поэтому я искал символ, например \xc7 в http://www.codetable.net , и заменил его на другой символ в моем файле.

Вы также можете изменить свой тип на utf8 , чтобы он возвращал меньше ошибок.

0
ответ дан yasi 21 August 2018 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: