Как поменять кодировку файла в python на UNF-8-BOM без \ufeff?
Пишу скрипт, который автоматически переведёт игру. Вся локализация игры лежит в файле с кодировкой utf-8-bom. Я перевожу и записываю перевод в файл, который тоже должен быть utf-8-bom, но python настойчиво делает из него обычный utf-8, чтобы перевести его в bom я создал такую функцию:
def encod_utf8_bom(self, path_on_file: str): file = open(path_on_file, encoding='utf-8', mode='r') encoding_file = [line.encode('utf-8-sig') for line in file] file.close() file = open(path_on_file, 'wb') [file.write(line) for line in encoding_file] file.close()
Но она ставит \ufeff впереди (отображается как точка впереди)
И в итоге перевод не работает. Однако если я сделаю перевод на utf-8 и через Notepad ++ сменю кодировку на utf-8-bom перевод заработает (и отображается без точек). Как мне сделать так же но в python?
- Вопрос задан более двух лет назад
- 286 просмотров
Python-сообщество
![]()
- Начало
- » Python для новичков
- » [csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
#1 Фев. 24, 2017 18:39:43
Pluto Зарегистрирован: 2012-05-29 Сообщения: 177 Репутация: 1 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
Есть csv-файл. Он в кодировке utf-8
csv_file = open(path, encoding = 'utf-8') csv_reader = csv.reader(csv_file)
Допустим в файле такие две строки:
FIRST_DATA, SECOND_DATA
THIRD_DATA, FOURTH_DATA
for row_from_csv in csv_reader: print (row_from_csv)
В итоге получаем:
['\ufeffFIRST_DATA', 'SECOND_DATA''] ['THIRD_DATA', 'FOURTH_DATA']
Что это за ‘\ufeff’?
Почему это значение прицепляется к первому значению из первой строки csv-файла?
Причём, если в первом print попытаться вывести не весь список,
а только первый элемент
print (row_from_csv[0])
, то получим в консоли
FIRST_DATA
якобы без мусора в начале.
Долго же я мучился, пытаясь сверить первый элемент первого списка со значением “FIRST_DATA”, а получалось, что
print (row_from_csv[0], " == FIRST_DATA", row_from_csv[0] == 'FIRST_DATA')
выдавало в консоли “чудесный” результат:
FIRST_DATA == FIRST_DATA False
Это какой-то косяк csv.reader? Может, я чего-то не знаю и что-то упускаю? Как избавиться от этого \ufeff?
Отредактировано Pluto (Фев. 24, 2017 18:42:44)
#2 Фев. 24, 2017 18:57:22
Romissevd От: Счастье Зарегистрирован: 2015-03-01 Сообщения: 533 Репутация: 76 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
#3 Фев. 25, 2017 03:41:23
py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9636 Репутация: 839 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
Pluto
Что это за ‘\ufeff’?
Это BOM (byte order mark) — признак, который сообщает об эндианстве. Эти два байта сами по себе упорядочены — 0xfe меньше, чем 0xff. Поэтому в зависимости от хранения, они идут либо в таком порядке, либо в обратном. Причём это нужно только для utf-16 и utf-32, так как они хранятся в виде многобайтовых целых чисел (у которых и есть эндианство), но его добавляют и к utf-8, хоть utf-8 и находится всегда в большом эндианстве, так как она состоит из однобайтовых целых чисел (у которых нет эндианства). По-моему, его стали добавлять к utf-8 из-за редакторов, которые его всегда искали. То есть он никак не помогает раскодировать utf-8.
Отредактировано py.user.next (Фев. 25, 2017 03:43:59)
#4 Фев. 25, 2017 09:22:28
Pluto Зарегистрирован: 2012-05-29 Сообщения: 177 Репутация: 1 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
Спасибо за помощь. Что-то не додумался искать в яндексогуглах именно по \ufeff. Устал, видать, вчера.
Буду выбрасывать сие значение из первого элемента путём row_from_csv.replace(“\ufeff”, “”)
Зачем же csv.reader выдаёт это значение в качестве части первого элемента из csv-файла?
csv.reader ничего не знает про этот BOM?
Как-то это неудобно постоянно помнить про этот бом-би-бом и не забывать при считывании данных отбрасывать его в первом элементе.
#5 Фев. 26, 2017 01:59:29
py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9636 Репутация: 839 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
Pluto
csv.reader ничего не знает про этот BOM?
Да, для него это просто часть строки. Формат csv тем и хорош, что не отбрасывает ничего, он сделан для точной передачи данных, какие бы они ни были.
#6 Фев. 26, 2017 08:53:14
doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
Pluto
Как-то это неудобно постоянно помнить про этот бом-би-бом и не забывать при считывании данных отбрасывать его в первом элементе.
Посмотрите как все развивалось. Вначале было достаточно 7 бит на одну букву. Потом начали использовать восьмой, в каждой стране по своему. Поэтому чтобы понять как отображать символы нужна дополнительная информация. В windows-rus например одновременно используются 2 способа cp866 и cp1251. Люди начали придумывать как добиться однозначности трактовки содержимого файлов. Договорились что будут использовать unicode. Но к сожалению придумали несколько способов упаковки его в файлы utf-5 utf-6 utf-8 utf-16LE/BE UTF-32LE/BE… Чтобы различить эти некоторые из этих способов придумали BOM. На мой взгляд сейчас идет активный процесс вымывания старых кодировок (cp1251 cp866 и т.п.). Среди используемых кодировок похоже побеждает utf-8. Например в новых наших проектах декларируется использование только utf-8. Тогда BOM не нужен.
Мораль. Не следует ждать что в csv добавят обработку BOM. Народ просто будет ждать когда он сам вымрет. Не надо мучаться с BOM, чтото там выкидывать проверять номер строки и т.п., настройте средство которым вы получаете файл так чтобы оно не добавляло bom. Если не получится сделайте фильтр который будет выкидывать bom и приводить все фходные файлы в utf-8 без bom.
#7 Фев. 26, 2017 13:26:54
PooH От: Зарегистрирован: 2006-12-05 Сообщения: 1948 Репутация: 72 Профиль Отправить e-mail
[csv + utf8] Модуль csv. Что это за косяк с первыми данными из файла?
with open(path, encoding='utf_8_sig') as csv_file: csv_reader = csv.reader(csv_file) for row_from_csv in csv_reader: print(row_from_csv)
Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…
Ошибка Unexpected character \ufeff
В процессе загрузки серверного проекта возникает ошибка:

Скрипты соотв. не работают.
Скрипты в проект добавлял импортом из внешнего файла, в который ранее делал сохранение из другого проекта.

Если преобразовать файлы в ANSI формат — скрипты работают корректно, но при импорте теряются все символы кириллицы.

Under review
Как загружаете проект на сервер (трансфер, облако)?
Какая версия сервера?
Приложите ваш проект.

ошибка не только на сервере появляется, но и в эмуляторе
версия последняя — 1.3.24 с последнего обновления
проект пока не могу приложить

Можете любой проект дать, в котором повторяется ошибка?

Не получается в новой студии воспроизвести глюк с экспорт-импортом файла. Глючные файлы экспортировал из старых версий иридиум студии давно.
Думаю тему можно закрывать.

Скорее всего причина — BOM в одном из скриптов. Возможно вы текст срипта набирали во внешнем редакторе. Если это так, то достаточно пересохранить текст JS любым редактором в UTF-8 без BOM и скопировать в скрипт проекта результат.
Курсы javascript
Т.е. это, как правило, решает разработчик в купе с заказчиком.
12.02.2015, 11:12
Регистрация: 02.12.2014
Сообщений: 72
ksa,
А можно вообще все escape-последовательности запретить, как тут на форуме. Тут ведь просто они экранируются, вот так \\uFEFF, да?
12.02.2015, 11:18
Регистрация: 19.08.2010
Сообщений: 14,092
"запретить escape-последовательности"=true;
12.02.2015, 12:06
Регистрация: 02.12.2014
Сообщений: 72
ksa,
Я имею ввиду, что можно просто экранировать обратный слеш \, в следствие чего пользователь не сможет ввести символ используя escape-последовательность, это будет просто текст:
alert("\\uFEFF"); // \uFEFF
