LINUX.ORG.RU

[python3] Кодировка файлов


0

1

Время от времени пытаюсь осилить питон, но каждый раз бросаю свои начинания.
Уже не первый раз натыкаюсь на непонятные ошибка в кодировке, то не возможно комментарии на русском писать, то с русскими строками проблемы. Сейчас пытаюсь считать из файла строку
Начало файла такое

#!/usr/bin/env python
# -- coding: utf-8 --
Далее f = open(file, 'r', encoding=«utf-8»)
Выдает следующую ошибку
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 19164: invalid start byte.
1.Как это исправить?

2.Можно ли обойтись без явного указания кодировки?
3.Почему в питоне вечная проблема с кодировкой? Почему на java, Qt, C++ пишешь и таких лулзов не ловишь?


>Можно ли обойтись без явного указания кодировки?

Обязательный только 1-ый параметр open().

gentoo_root ★★★★★ ()

Ничего не поделаешь, это python2.

blackst0ne ★★★★★ ()

1.Как это исправить?

Указать верную кодировку или, если файл битый (что вполне может быть), то прочитать документацию, на предмет параметра errors.

2.Можно ли обойтись без явного указания кодировки?

Да.

3.Почему в питоне вечная проблема с кодировкой?

Это зависит от ДНК программиста.

baverman ★★★ ()
Ответ на: комментарий от gentoo_root

Спасибо, действительно мой косяк. Пытался скормить ему файл в кодировки cp866.
Кстати если указывать f = open(file, 'r'), без явного указания кодировки то вылетает такая же ошибка как и если бы я указал не верную кодировку.
И последний вопрос, пытаюсь переписать bash скрипт на python, но не могу найти замену awk. Есть строка вида

test      [n/a]           [n/s]                   date
Надо взять только test и date в баше я это делал в два подхода
`echo $line | awk '{print $4}'`                                                                                               
`echo $line | awk '{print $1}'
Как это по красивому написать на python?

n4ela ()
Ответ на: комментарий от n4ela

Надо взять только test и date в баше я это делал в два подхода

В два подхода ты два раза вызываешь echo, и два раза вызываешь awk, что лишнее, т.к. всё делается в один подход:

[ blackst0ne at blackberry: /tmp ]% echo 'test      [n/a]           [n/s]                   date' > awk
[ blackst0ne at blackberry: /tmp ]% cat awk | awk '{print $1"\n"$4}'                                   
test
date
[ blackst0ne at blackberry: /tmp ]%
blackst0ne ★★★★★ ()
Ответ на: комментарий от n4ela

Кстати если указывать f = open(file, 'r'), без явного указания кодировки то вылетает такая же ошибка как и если бы я указал не верную кодировку.

Прочти уже документацию, наконец.

baverman ★★★ ()
Ответ на: комментарий от n4ela

> Кстати если указывать f = open(file, 'r'), без явного указания кодировки то вылетает такая же ошибка как и если бы я указал не верную кодировку.

Он пытается открыть в дефолтной кодировке - то бишь ascii.

anonymous ()
Ответ на: комментарий от anonymous

Он пытается открыть в дефолтной кодировке - то бишь ascii.

Третий пытается открыть в кодировке текущей локали.

baverman ★★★ ()
Ответ на: комментарий от anonymous

В третьем питоне кодировка исходников по-умолчанию предполагается в utf-8.

baverman ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.