- Python-сообщество
- Уведомления
- #1 Апрель 10, 2013 14:34:57
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #2 Апрель 10, 2013 16:12:19
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #3 Апрель 10, 2013 16:32:20
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #4 Апрель 10, 2013 17:10:15
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #5 Апрель 10, 2013 17:25:47
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #6 Апрель 10, 2013 17:36:36
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #7 Апрель 10, 2013 17:57:19
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #8 Апрель 10, 2013 18:11:04
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #9 Апрель 10, 2013 18:39:16
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- Python: конвертируем кодировку текстовых файлов в UTF-8
- Добавить комментарий Отменить ответ
- How to convert a string from cp1251 to UTF-8 in Python3?
- 4 Answers 4
- Как записать текст на русском в файл UTF-8?
- Кодировка windows 1251 питон
- Открываем, а затем читаем или записываем
- Чтение файла с разной кодировкой
- Добавление в конец и запрет открытия файлов
- Временные файлы
- Именованные временные файлы
- Временные папки
Python-сообщество
Уведомления
#1 Апрель 10, 2013 14:34:57
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Доброго времени суток уважаемые форумчане.
Пробую тут передать данные на страницу с формами(multipart/form-data) на сайт. Столкнулся с проблемой кодировок. Итак суть:
1. сайт в кодировке Windows-1251
2. файл, в котором идут поля которые нужно передать в кодировке Windows-1251
3. Пример скрипта, тоже в cp1251, запускается на FreeBSD:
Данные передает, но в форме странный текст: тест
Я так понимаю, POST по стандарту передает в utf-8, вот почему такой результат. Как заставить передавать его в Windows-1251 ?
Буду благодарен за любой совет или пинок в правильную сторону
———
П.С. кому интересно решение и нет охоты читать все ответы, то тут все просто, возможности передать cp1251 через multipart/form-data в Python 3/requests пока нет. Только UTF-8. Так что передавайте data=postdata через form-urlencoded
Отредактировано omatic (Апрель 11, 2013 22:15:22)
#2 Апрель 10, 2013 16:12:19
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Я уже говорил когда-то. Тех, кто использует восьмибитные кодировки, надо сжигать на кострах.
#3 Апрель 10, 2013 16:32:20
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
ZZZ, я тоже за использование юникода и utf-8, но на сайте кодировка Windows-1251, и этого я изменить не могу, вот и пробую выкрутиться, что бы хоть как-то туда автоматический постинг прикрутить.
#4 Апрель 10, 2013 17:10:15
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
На самом деле в s_cp1251 находится Юникод, а requests его заботливо перекодирует в utf-8 при отправке.
Чтобы отправить текст в своей кодировке, нужно передавать байтовые объекты:
#5 Апрель 10, 2013 17:25:47
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
reclosedev, Спасибо, другой вопрос, передаем мы теперь в бинарном режиме, соответственно в форме на сайте я теперь получаю:
Отредактировано omatic (Апрель 10, 2013 17:25:56)
#6 Апрель 10, 2013 17:36:36
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
А вопрос в чем? Как это в текст переделать?
#7 Апрель 10, 2013 17:57:19
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Вопрос в передаче строки через requests в правильной кодировке. Вот пример:
сделал и передал:
соответственно оно и передало мне в бинарном режиме, и на сайте куда передавал в форме получения текст: b’\xf2\xe5\xf1\xf2′
Если я передаю, переделав в текст:
то получаю в форме: тест как и в первом варианте, когда передавал просто текст без кодирование.
Но нужно что бы в форме на сайте получился текст “тест”
Отредактировано omatic (Апрель 10, 2013 17:57:28)
#8 Апрель 10, 2013 18:11:04
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Где это смотрится? Полагаю, что получено в ответе с сайта. Так вот перекодируйте это и будет ‘тест’.
#9 Апрель 10, 2013 18:39:16
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
reclosedev, на сайте, может я плохо обьяснил, смотрите:
Суть в том , что есть форум, в компании(хостера), мне нужно текст со своего ПК туда постить в ветку форума/новости. Форум у них на IPB старой версии, который на кодировке Windows-1251. Соответственно я делаю логин скриптом и передаю в форму создания поста, слово “тест” POST запросом, вот что я передаю то и появляется в созданной теме на форуме.
тоесть: передаю с Питона слово тест а получаю на форуме тест , соответственно я немогу там его кодировать/декодировать , передавая бинарным способом и т.п.
Вот тут то я и запутался, я неправильно передаю или просто форма форума не правильно воспринимает то что я передаю?
Отредактировано omatic (Апрель 10, 2013 18:42:27)
Python: конвертируем кодировку текстовых файлов в UTF-8
Я, и пожалуй это не удивительно, люблю аниме, как и многие в современном мире. Единственное — терпеть не могу русскую озвучку и предпочитаю смотреть с субтитрами. Но…большинство релизеров сидят на windows и совершенно не думаю о том, что существуют других ОС, для которых кодировка windows-1251 не то что не является родной, но и вообще корректно не отображается. Начав не так давно изучать python, стал думать о различных, полезных для «дома» скриптах, а прочитав на днях статью на хабре Приводим русские тексты на Mac OS X в одну кодировку Python-скриптом, как то оно меня подтолкнуло к написанию простенького скрипта, который бы этим и занимался. О нём и расскажу.
Сам скрипт достаточно простенький и небольшой, вот листинг:
Скрипт проверяет входной файл на кодировку, если файл в кодировке, отличной от UTF-8 — конвертирует файл. Для корректной работы скрипта нам необходим модуль chardet. Его нужно скачать, ну а дальше всё просто — разархивируем модуль, через консоль заходим в эту директорию, допустим:
и выполнить команду:
модуль достаточно быстро установится и скрипт будет полностью работоспособен.
Скрипт способен конвертировать как одиночный файл, так и всю директорию целиком (находя в ней только файлы с расширением srt, ass, txt). Примеры:
Если вызвать скрипт без аргументов, то вы получите приглашение ввести путь к директории или файлу.
Скрипт на github где жду ваших фиксов и дополнений.
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
How to convert a string from cp1251 to UTF-8 in Python3?
A help needed with a pretty simple Python 3.6 script.
First, it downloads an HTML file from an old-fashioned server which uses cp1251 encoding.
Then I need to put the file contents into a UTF-8 encoded string.
Here is what I’m doing:
Here is the error:
I’d really appreciate any help with it.
4 Answers 4
Not sure what you are trying to do.
.text is the text of the response, a Python string. Encodings don’t play any role in Python strings.
Encodings only play a role when you have a stream of bytes that you want to convert to a string (or the other way around). And the requests module already does that for you.
For example, assume you have a text file (i.e.: bytes). Then you must pick an encoding when you open() the file — the choice of encoding determines how the bytes in the file are converted into characters. This manual step is necessary because open() cannot know what encoding the bytes of the file are in.
HTTP on the other hand sends this in the response headers ( Content-Type ), so requests can know this information. Being a high-level module, it helpfully looks at the HTTP headers and converts the incoming bytes for you. (If you would use the much more low-level urllib , you’d have to do your own decoding.)
The .encoding property is purely informational when you use the .text of the response. It might be relevant if you use the .raw property, though. For work with servers that return regular text responses, using .raw is seldom necessary.
Как записать текст на русском в файл UTF-8?
1. Почему файлы ‘str_ru_text_1.txt’, ‘str_ru_text_2.txt’ в кодировке Windows 1251, а файлы ‘str_en_text_1.txt’, ‘str_en_text_2.txt’ — в UTF-8?
2. Есть ли способ записать utf-8 без str.encode(‘utf-8’)?
3. Где описаны правила записи строк в файл? Где и что почитать по этой проблеме?
Python 3.4, Windows 8.1
- Вопрос задан более трёх лет назад
- 26826 просмотров
Товарищи, это писец какой-то. Хотели как лучше, а получилось еще более через жопу.
mode is an optional string that specifies the mode in which the file is opened. In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave encoding unspecified.)
1. Если не указан режим ‘b’, то по умолчанию файл считается текстовым. В двоичный файл можно писать только байты, в текстовый — только юникод.
(В текстовом режиме файл читается только до EOF (‘\x1a’). Как совместить чтение до конца файла и запись юникода в файл? А никак.)
2. Если кодировка не указана, по умолчанию берется locale.getpreferredencoding(False), т.е. результат выполнения будет зависеть от настроек оси! (для винды — от текущей локали). Нахера. От одних граблей избавились, другие приобрели.
В общем, всегда явно указывай явно кодировку файла.
Кодировка windows 1251 питон
На практике в реальных проектах Data Science часто приходится сталкиваться с чтением датасетов, а также записывать добытую в ходе вычислений информацию в файлы. Сегодня мы расскажем о работе с файлами в Python: чтение и запись, проблема с кодировками, добавление значений в конец файла, временные папки и файлы.
Открываем, а затем читаем или записываем
Предположим, у нас имеется файл, который нужно прочитать в Python. Для этого можно воспользоваться функцией open внутри контекстного менеджера:
Таким же образом можно записать информацию в файл, указав w в качестве аргумента:
Отметим некоторые особенности данной функции. Во-первых, для чтения файла мы не указывали никаких аргументов кроме имени файла, поскольку по умолчанию уже стоит режим чтения. Мы также не указывали явно, что это именно текстовый файл, а не бинарный, так как это тоже стоит по умолчанию. Для чтения и записи бинарных файлов добавляется b , например, rb или wb .
Во-вторых, мы использовали функцию open в контекстном менеджере. Можно обойтись и без него, но тогда после чтения или записи следует закрыть файл.
На открытие файла Python выделяет память, поэтому, чтобы избежать ее утечки, рекомендуется закрывать файлы.
Чтение файла с разной кодировкой
На многих операционных системах Python в качестве стандарта кодирования использует UTF-8, который также поддерживает кириллицу. Тем не менее, часто можно столкнуться с проблемами неправильной кодировки и получить распространенную ошибку вроде этой:
В примере указана кодировка ASCII, но файл закодирован в другом формате, поэтому и возникает такая ошибка. Решить ее можно тремя способами:
- Указать erorr=replace , который заменит нераспознанные символы знаком ? :
- Указать erorr=ignore , который проигнорирует нераспознанные символы:
- Указать правильную кодировку. Если текст на русском языке, то можно посмотреть кодировки с поддержкой кириллицы, которые есть в документации Python. Например, явно указать UTF-8 или cp1251:
Добавление в конец и запрет открытия файлов
Как мы уже отметили ранее, для записи текстового файла добавляется аргумент w . Но если вызвать метод write, он перепишет весь файл. Во многих случаях требуется добавить данные в конец файла. Тогда используется a вместо w :
Если файла не существует, то при a и при w он будет создан. Но чтобы не трогать существующие файлы, а создать новый, передается параметр x :
Временные файлы
Иногда бывает, что требуется создать файл или папку внутри Python-программы, а после ее закрытия их нужно удалить. Тогда пригодится стандартный модуль tempfile. Например, класс TemporaryFile создаст временный файл, который удалится после закрытия. Ниже пример в Python.
Обратите внимание на 3 вещи. Первое, мы явно передаем «w+t» , чтобы записать как текстовый файл, поскольку по умолчанию стоит «w+b» для бинарных файлов. Второе, метод seek(0) используется для перехода на самый первый символ, поскольку чтение происходит с текущего указателя, а он стоит в конце (после буквы ‘o’ в слове ‘hello’). Поэтому не стоит переживать, что мы можем стереть предыдущую запись:
Третье, файл TemporaryFile невидим для файловой системы, он используется только внутри Python, поэтому извне будет трудно его найти.
Именованные временные файлы
А вот объекты класса NamedTemporaryFile будут видны файловой системе, и найти месторасположение можно с помощью атрибута name :
Как можно заметить, файл называется tmp60djsgli . Для удобства можно явно указать его название и формат:
Временные папки
Кроме временных файлов можно создавать временные папки. Для этого используется класс TemporaryDirectory :
Он также принимает в качестве аргументов prefix и suffix , а также может использоваться внутри контекстного менеджера Python.
В следующей статье поговорим о взаимодействии файловой системы и Python. А получить практические навыки работы с файлами на реальных проектах Data Science вы сможете на наших курсах по Python в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.