Форум сайта python.su
ZerG
ZerGС софтины APACS 3000, которая по списку сотрудников делают выгрузку времени посещения за определённый период. Думаю писать такой коннект с выборкой будет слишком громоздко. Проще выгружать тиблицу csv'шкой и резать скриптом. Вообще по идее можно справиться и средствами экселя, но думаю если будет готовый скрипт для этого, будет всё же удобнее. К тому же учу язык по ходу
А откудова идет импорт? может вам проще на питоне сразу коненкт в базу данных написать и делать выборку?
Офлайн
как раз таки если доступ к базе есть то легче делать запрос из нее чем заходить в прогу - делать експорт - сохранять в файл читать файл парсить - сохранять результат
Офлайн
ZerG
Придётся писать выборку по определённому промежутку времени и по именам/отделам/должностям и т.д., а к этому всему ещё и интерфейс D:
Офлайн
coffe4wolfВ идеале, сам файл должен храниться в utf-8. Кодировку ты никак не определишь, её надо знать (иметь записанной для каждого источника данных). То есть у тебя должен быть отдельный конвертер, который переводит файл из одной кодировки в другую. Этот конвертер должен получать на вход три параметра: кодировка из, кодировка в, и путь к файлу. А на выходе он делает новый файл в правильной кодировке. И вот когда у тебя есть правильный файл, он подаётся уже скрипту анализа полей. Когда ты их обработал и сохранил, конвертер обратно его преобразует (если надо), чтобы в той программе, откуда он пришёл, он отображался правильно.
Чем мне кодировку точно определить? Как писал, несколько разных программ дают разные ответы на этот вопрос
coffe4wolfТы когда через codecs.open() открываешь с указанием кодировки, он уже переводит в юникод. utf-8 покрывает весь юникод, в отличие от других кодировок типа cp1251 и подобных.
Перевод в юникод не должен участвовать в этой цепочке?
>>> import codecs >>> >>> f = codecs.open('/etc/passwd', encoding='utf-8') >>> s = f.readline() >>> s u'root:x:0:0:root:/root:/bin/bash\n' >>> f.close() >>> >>> import csv >>> >>> reader = csv.reader([s], delimiter=':') >>> list(reader) [['root', 'x', '0', '0', 'root', '/root', '/bin/bash']] >>>
Отредактировано py.user.next (Июнь 9, 2016 15:33:24)
Офлайн
coffe4wolfМного писанины а проблема не обсуждается. Насколько я понимаю проблема в том что переводы строки попадаются “посреди строки”. Это не csv файл и читать его csv ридером не имеет смысла. Опирайтесь на то что формат строгий, можно опереться на количество полей.
Проблема в том, что есть строки вида
Владимиров М.Ю.;;;
;17.04.2016 7:47:52;17.04.2016 20:08:53;
import codecs import re with codecs.open("testcsv.csv","r",encoding="cp1251") as f: data=f.read() ds = re.split(r"[;\r\n]",data) for i in range(15,len(ds)-1,10): if ds[i+1]: print(ds[i])
Офлайн
doza_and
Кстати всё же не понимаю - почему не csv файл? Если поставлю разделители запятые он им типа станет? о.О
doza_andНе, судя по “сырому” выводу переводы строки в конце строки. Проблема удалить определённые строки, не удалив при этом лишние. Например выбрать строки так, чтобы удалить всё строки вида
Насколько я понимаю проблема в том что переводы строки попадаются “посреди строки”.
Отредактировано coffe4wolf (Июнь 9, 2016 22:45:17)
Офлайн
coffe4wolfВас вывод моего кода устраивает? Там все решено. В чем еще проблемы?
Проблема удалить определённые строки,
coffe4wolfhttps://ru.wikipedia.org/wiki/CSV “текстовый формат, предназначенный для представления табличных данных” “Каждая строка файла — это одна строка таблицы. Строки разделяются парой символов CR LF (0x0D 0x0A)”
почему не csv файл?
Отредактировано doza_and (Июнь 9, 2016 23:20:05)
Офлайн
coffe4wolfЭто не csv-файл только по одной причине - у него разделитель не запятая. Это dsv-файл, где разделитель - точка с запятой.
Кстати всё же не понимаю - почему не csv файл?
doza_andУ него там просто записи с пустыми полями, потому что это бралось из такой таблицы - с пустыми полями.
Насколько я понимаю проблема в том что переводы строки попадаются “посреди строки”.
6. Fields containing line breaks (CRLF), double quotes, and commas
should be enclosed in double-quotes. For example:
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
Отредактировано py.user.next (Июнь 10, 2016 03:52:28)
Офлайн
doza_and
Вывод хороший, но он отрезал все строки со временем Но думаю
попытаюсь смогу из кода сделать то, что нужно
doza_andДа нет, всё верно. Опишу всё более полно, дабы прояснить.
Я подозреваю что вы неправильно интерпретируете ваш файл.
ФИО;Первый приход;Последний уход;
Арбузов А.А.;;;
;;;
Баранов Б.Б.;16.04.2016 14:09:36;16.04.2016 15:48:11;
;;;
Баранов Б.Б.;16.04.2016 8:37:16;16.04.2016 20:12:24;
;17.04.2016 8:22:54;17.04.2016 22:06:33;
Баранов Б.Б.;;;
;17.04.2016 7:47:52;17.04.2016 20:08:53;
py.user.nextУ меня есть возможность формировать эти таблицы с разделителем запятой. Лучше формировать отчёт с этим разделителем, чтобы можно было работать с csv-модулем? Хотя в принципе же, при инициализации ридера или райтера можно задать любой желаемый разделитель и работать с файлом как с обычным csv. Или я неправильно понимаю?
Это не csv-файл только по одной причине - у него разделитель не запятая. Это dsv-файл, где разделитель - точка с запятой.
Отредактировано coffe4wolf (Июнь 10, 2016 12:41:24)
Офлайн
Так а нафига вы вобще с CSV что-то делаете если есть прекрасная возможность работать с файлами екселя в питоне? ?????
повторю еще раз - на всякий случай!
Гораздо проще цепляться к базе данных и выгребать то что вам нужно - формировать ето в что угодно и так далее ! Чем настраивать импоры кодировки И так далее и тп
Отредактировано ZerG (Июнь 10, 2016 12:43:24)
Офлайн