Форум сайта python.su
coffe4wolfПотому что у codecs нет режима текст, он все в бинари читает. И между прочим это правильно.
Не пойму почему он ругается на режим чтения
Офлайн
coffe4wolf
Тащемта вот мучаемый файл
>>> 'юАЮЬХДГЕ'.encode('koi8-r').decode('cp1251') 'Абашидзе' >>>
ZerGУ него сам файл раскодирован в koi8-r.
Ну так давайте разберемся? Какая у вас ос? Какая кодировка?
ZerGНикакого .replace() не должно быть, разделитель надо передать при открытии файла.data = str(i[0].decode("cp1251").encode("utf8")).replace(';', '')
Отредактировано py.user.next (Июнь 9, 2016 02:27:44)
Офлайн
У меня не было времени углубляться и вопрос у ТС был не по разделителям.
Кроме того мне он скинул файл в cp1252 с кодировкой текста в нем в cp1251
Ну и разделитель там у него не ‘;’ а ‘;;;’
Там исходный файл еще кривой как брови у корела фарела.
Офлайн
ZerG
Ну за каждый “если” спасибо, я таки потестю. С кодировками работать практически не приходилось, потому я совершенно не сведущ в вопросе и порой даже не знаю за что цепляться
ZerGНе, разделитель ‘;’, там где ‘;;;’ это разделители меж трёх пустых полей.
Ну и разделитель там у него не ‘;’ а ‘;;;’
ZerGВообще конечная цель у меня удалить из файла строки с фамилиями, у которых нет данных времени. Проблема в том, что есть строки вида
У меня не было времени углубляться и вопрос у ТС был не по разделителям.
Офлайн
ZerGЭто обычный csv (dsv), у него разделитель не может быть несколько символов (это и не требуется).
Ну и разделитель там у него не ‘;’ а ‘;;;’
abc;def;ghi
abc;"d; e; f";ghi
coffe4wolfВ csv.reader() надо передать точку с запятой как разделитель, тогда он будет по нему разделять.
Такие пары нужно оставлять, как сделать это через модуль csv я так и не додумался, посоветовали делать через регулярки.
Отредактировано py.user.next (Июнь 9, 2016 11:18:22)
Офлайн
py.user.next
py.user.nextВ моём случае разделитель посреди поля не попадётся, софтина выдаёт таблицу строго фиксированного формата типа
потому что разделитель может быть внутри поля - то есть иметь значение.
r'[A-zА-я\s\.]+[;]{3}[\n]{1}[;]{3}'
py.user.nextПо нему он будет разбивать поля и записывать в список?
В csv.reader() надо передать точку с запятой как разделитель, тогда он будет по нему разделять.
Отредактировано coffe4wolf (Июнь 9, 2016 13:57:29)
Офлайн
Не будет. Он будет возвращять ‘;какойто текст;’
кароче автору надо для начала с импортом файла разобраться.
Офлайн
ZerG
Я до этого уже пытался через модуль csv работать с файлом, но не могу разобраться в каком виде файл загружается в reader и как работать с полями. Т.к. по идее, чтобы выбрать все необходимые поля из таблицы, нужно будет сравнивать сразу по два поля - текущее и следующее.
Но вообще да, на данный момент самая большая проблема с импротом
Офлайн
А откудова идет импорт? может вам проще на питоне сразу коненкт в базу данных написать и делать выборку?
Офлайн
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Надо открыть файл через codecs.open(), указав правильную кодировку. И сам файл тоже должен быть в правильной кодировке. Если у него неправильная кодировка, то нужно сначала его перекодировать в правильную.
Я до этого уже пытался через модуль csv работать с файлом, но не могу разобраться в каком виде файл загружается в reader
Отредактировано py.user.next (Июнь 9, 2016 14:31:56)
Офлайн