Форум сайта python.su
Добрый день. Пытаюсь записать в файл строку, в которой есть символ ‘†’ (\u2020), делаю это так -
line = 'test †' with open('filetest.bin', 'wb') as file: file.write(line.encode())
UnicodeEncodeError: ‘charmap’ codec can't encode character ‘\u2020’ in position 9: character maps to
<undefined>
Офлайн
в начало файла
# -*- coding: utf-8 -*-
line.decode('utf-8').encode('utf-8')
Отредактировано ZerG (Окт. 12, 2016 16:57:14)
Офлайн
netilovЗависит от версии питона то, как это делается. Если второй питон, то надо использовать юникодовую строку с u в начале, а файл открывать через codecs.open() с указанием кодировки. Если третий питон, то надо просто указать кодировку при открытии файла.
Пытаюсь записать в файл строку, в которой есть символ ‘†’ (\u2020)
Отредактировано py.user.next (Окт. 12, 2016 20:20:18)
Офлайн
py.user.nextВ чем такая обязательность? Файл читается байтиками, и пофиг в какой он кодировке. Потом можно ее привести к требуемой. Или не приводить, если файл например нужно скопировать… ИМХО непременность перекодирования в какието строки скрывает возможность обычных байтов хранить инфу даже на инопланетном языке…
codecs.open()
Офлайн
IskatelДавно уже принято во всех языках использовать юникод в программах. Прямо как возможность такая появилась, так и приняли все такое правило. А до этого всё в байтах читали. Второй питон унаследовал стиль из 90-х годов (время развития юникода), поэтому там всё так и сделано неудобно. А третий питон уже из нулевых, поэтому в нём сделано всё так, как и должно быть - байты используются только тогда, когда это нужно.
В чем такая обязательность? Файл читается байтиками, и пофиг в какой он кодировке.
IskatelТак инопланетянин на своём языке запишет что-нибудь, а ему скажут “а ты сначала перекодируй в байты”. Ему это зачем? Ты же когда в блокноте текст читаешь, не думаешь, что он в такой-то кодировке, тебе буквы нужны конкретные, а не заморочки.
ИМХО непременность перекодирования в какието строки скрывает возможность обычных байтов хранить инфу даже на инопланетном языке
Отредактировано py.user.next (Окт. 13, 2016 05:08:22)
Офлайн
И всегда упор на текст…
Нам, выросших на асме и сях, нифига не понятно почему файл === текст
ИМХО для начала им стоит понять что такой файл, и что “текста” в мире проценов 10 от всего “фаиловового имущества”
А если конкретнее, то понимание что такое файл, очень быстро решает вопросы с кодировками и.т.п.
Ведь многие даже не знают, что копм не знает букв… для них это откровение.
Офлайн
IskatelЕще надо взять выросших на UNIX. файл это поток байт (для инопланетян можно побить на биты)
не понятно почему файл === текст
py.user.nextТак что думаю Isketel прав.
тебе буквы нужны конкретные, а не заморочки.
Офлайн
doza_andВот как это выглядит в третьем питоне
Может ошибаюсь но по сути unicode обеспечивает выполнение одной дополнительной операции - взятие буквы по целочисленному индексу.
>>> '탡' * 10 '탡탡탡탡탡탡탡탡탡탡' >>>
>>> '탡' '\xed\x83\xa1' >>> '탡' * 10 '\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1\xed\x83\xa1' >>>
doza_andДа, скорее всего.
А теперь вопрос в чем я не прав? Может я не знаю для чего нужен unicode?
Отредактировано py.user.next (Окт. 14, 2016 12:50:59)
Офлайн
py.user.nextВаш пример не имеет отношения к обсуждаемому примеру. Я ведь не против типа string. Вопрос что в нем хранить unicode или utf-8. Очевидно что корректное отображение на консоли или в файлах этих данных будет абсолютно идентично.
А вот так это выглядит во втором
py.user.nextВот в этом и суть. Как вы будете брать подстроку? Зачем ее брать?
В третьем питоне я легко могу подстроку взять из определённых символов
py.user.nextЧеловек зырит в файл или на консоль. И ему пофиг unicode это или utf-8, главное чтобы выглядело корректно.
Как минимум ты можешь хранить всё в том виде, в котором оно и используется человеком
Отредактировано doza_and (Окт. 14, 2016 20:44:29)
Офлайн
Я рискую быть обруганым, но всеже: причем тут нафиг строки??? Неужели файлы состоят только из строк?
Прошерстите свои диски и скажите столько именно текстовых файлов на нем? (для тех кто на винде https://windirstat.net в помощь)
Киношки, фотки и т.п. Питон не может чтоль? А какже opencv например?
Или взять вот rtmp всеми любимый поток для флеша, на AC3… Вы его как разбирать будете? а в нем и видео и служебные команды, и да, вами любимые строки…
Студента учат строкам, студент расстроен, что питон кроме строк ничего не умеет, питон помирает… Гдето так
Офлайн