Найти - Пользователи
Полная версия: CSV-файл - определение и изменение кодировки
Начало » Python для новичков » CSV-файл - определение и изменение кодировки
1 2 3 4
doza_and
coffe4wolf
Не пойму почему он ругается на режим чтения
Потому что у codecs нет режима текст, он все в бинари читает. И между прочим это правильно.
py.user.next
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 может оказаться в поле в проэкранированном виде как часть текста.
ZerG
У меня не было времени углубляться и вопрос у ТС был не по разделителям.
Кроме того мне он скинул файл в cp1252 с кодировкой текста в нем в cp1251
Ну и разделитель там у него не ‘;’ а ‘;;;’
Там исходный файл еще кривой как брови у корела фарела.
coffe4wolf
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 вычесать лишнее.
К слову о разделителе - таблицу мне формирует софтина, там разделитель можно задать произвольный,по умолчанию стоит ‘;’
py.user.next
ZerG
Ну и разделитель там у него не ‘;’ а ‘;;;’
Это обычный csv (dsv), у него разделитель не может быть несколько символов (это и не требуется).
Его нельзя обрабатывать .replace()'ом и регекспами, потому что разделитель может быть внутри поля - то есть иметь значение.
abc;def;ghi
abc;"d; e; f";ghi
А если несколько разделителей идут подряд, то это просто пустые поля.

coffe4wolf
Такие пары нужно оставлять, как сделать это через модуль csv я так и не додумался, посоветовали делать через регулярки.
В csv.reader() надо передать точку с запятой как разделитель, тогда он будет по нему разделять.
coffe4wolf
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() надо передать точку с запятой как разделитель, тогда он будет по нему разделять.
По нему он будет разбивать поля и записывать в список?
ZerG
Не будет. Он будет возвращять ‘;какойто текст;’

кароче автору надо для начала с импортом файла разобраться.
coffe4wolf
ZerG
Я до этого уже пытался через модуль csv работать с файлом, но не могу разобраться в каком виде файл загружается в reader и как работать с полями. Т.к. по идее, чтобы выбрать все необходимые поля из таблицы, нужно будет сравнивать сразу по два поля - текущее и следующее.
Но вообще да, на данный момент самая большая проблема с импротом
ZerG
А откудова идет импорт? может вам проще на питоне сразу коненкт в базу данных написать и делать выборку?
py.user.next
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(), указав правильную кодировку. И сам файл тоже должен быть в правильной кодировке. Если у него неправильная кодировка, то нужно сначала его перекодировать в правильную.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB