Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 8, 2016 19:45:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

coffe4wolf
Не пойму почему он ругается на режим чтения
Потому что у codecs нет режима текст, он все в бинари читает. И между прочим это правильно.



Офлайн

#2 Июнь 9, 2016 02:11:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

coffe4wolf
Тащемта вот мучаемый файл
>>> 'юАЮЬХДГЕ'.encode('koi8-r').decode('cp1251')
'Абашидзе'
>>> 

ZerG
Ну так давайте разберемся? Какая у вас ос? Какая кодировка?
У него сам файл раскодирован в koi8-r.

ZerG
data = str(i[0].decode("cp1251").encode("utf8")).replace(';', '')
Никакого .replace() не должно быть, разделитель надо передать при открытии файла.
python.org. csv.reader()

Ты не можешь просто взять и заменить разделитель через .replace(), потому что разделитель в csv может оказаться в поле в проэкранированном виде как часть текста.



Отредактировано py.user.next (Июнь 9, 2016 02:27:44)

Офлайн

#3 Июнь 9, 2016 08:05:30

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

У меня не было времени углубляться и вопрос у ТС был не по разделителям.
Кроме того мне он скинул файл в cp1252 с кодировкой текста в нем в cp1251
Ну и разделитель там у него не ‘;’ а ‘;;;’
Там исходный файл еще кривой как брови у корела фарела.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#4 Июнь 9, 2016 10:36:00

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

ZerG
Ну за каждый “если” спасибо, я таки потестю. С кодировками работать практически не приходилось, потому я совершенно не сведущ в вопросе и порой даже не знаю за что цепляться

ZerG
Ну и разделитель там у него не ‘;’ а ‘;;;’
Не, разделитель ‘;’, там где ‘;;;’ это разделители меж трёх пустых полей.
ZerG
py.user.next
Насчёт кодировки вообще очень интересный вопрос. Пайчам в терминале при выводе пишет, что кодировка iso-8859-1. Если открываю нотпадом++ - он пишет windows-1251. И я чёт прям не знаю чему верить
ZerG
У меня не было времени углубляться и вопрос у ТС был не по разделителям.
Вообще конечная цель у меня удалить из файла строки с фамилиями, у которых нет данных времени. Проблема в том, что есть строки вида
Владимиров М.Ю.;;;
;17.04.2016 7:47:52;17.04.2016 20:08:53;
Такие пары нужно оставлять, как сделать это через модуль csv я так и не додумался, посоветовали делать через регулярки. Не придумал ничего умнее, чем слепить весь файл в строку и через re.sub вычесать лишнее.
К слову о разделителе - таблицу мне формирует софтина, там разделитель можно задать произвольный,по умолчанию стоит ‘;’

Офлайн

#5 Июнь 9, 2016 11:16:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

ZerG
Ну и разделитель там у него не ‘;’ а ‘;;;’
Это обычный csv (dsv), у него разделитель не может быть несколько символов (это и не требуется).
Его нельзя обрабатывать .replace()'ом и регекспами, потому что разделитель может быть внутри поля - то есть иметь значение.
abc;def;ghi
abc;"d; e; f";ghi
А если несколько разделителей идут подряд, то это просто пустые поля.

coffe4wolf
Такие пары нужно оставлять, как сделать это через модуль csv я так и не додумался, посоветовали делать через регулярки.
В csv.reader() надо передать точку с запятой как разделитель, тогда он будет по нему разделять.



Отредактировано py.user.next (Июнь 9, 2016 11:18:22)

Офлайн

#6 Июнь 9, 2016 13:53:09

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

py.user.next

py.user.next
потому что разделитель может быть внутри поля - то есть иметь значение.
В моём случае разделитель посреди поля не попадётся, софтина выдаёт таблицу строго фиксированного формата типа
Иванов И.И.;16.04.2016 11:03:53;16.04.2016 18:35:25;
;;;
Я подумал что если обрабатывать регекспами, то проще выбирать через sub пустые поля, так как в этом случае шаблон нужен будет всего один, типа
r'[A-zА-я\s\.]+[;]{3}[\n]{1}[;]{3}'
Понимаю, что метод очень топорный, но в рамках изучения языка интересно, как реализовать и этот метод для решения задачи
py.user.next
В csv.reader() надо передать точку с запятой как разделитель, тогда он будет по нему разделять.
По нему он будет разбивать поля и записывать в список?

Отредактировано coffe4wolf (Июнь 9, 2016 13:57:29)

Офлайн

#7 Июнь 9, 2016 13:57:42

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

Не будет. Он будет возвращять ‘;какойто текст;’

кароче автору надо для начала с импортом файла разобраться.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#8 Июнь 9, 2016 14:07:15

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

ZerG
Я до этого уже пытался через модуль csv работать с файлом, но не могу разобраться в каком виде файл загружается в reader и как работать с полями. Т.к. по идее, чтобы выбрать все необходимые поля из таблицы, нужно будет сравнивать сразу по два поля - текущее и следующее.
Но вообще да, на данный момент самая большая проблема с импротом

Офлайн

#9 Июнь 9, 2016 14:14:05

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

А откудова идет импорт? может вам проще на питоне сразу коненкт в базу данных написать и делать выборку?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#10 Июнь 9, 2016 14:30:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

CSV-файл - определение и изменение кодировки

coffe4wolf
По нему он будет разбивать поля и записывать в список?
>>> import csv
>>> import StringIO
>>> 
>>> stream = StringIO.StringIO('a;b;c;d\r\nd;e;f;g\r\n;;;\r\n')
>>> 
>>> reader = csv.reader(stream, delimiter=';')
>>> list(reader)
[['a', 'b', 'c', 'd'], ['d', 'e', 'f', 'g'], ['', '', '', '']]
>>>

coffe4wolf
Я до этого уже пытался через модуль csv работать с файлом, но не могу разобраться в каком виде файл загружается в reader
Надо открыть файл через codecs.open(), указав правильную кодировку. И сам файл тоже должен быть в правильной кодировке. Если у него неправильная кодировка, то нужно сначала его перекодировать в правильную.



Отредактировано py.user.next (Июнь 9, 2016 14:31:56)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version