Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169

Распарсить файл

06.05.2015, 06:55. Показов 5773. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разбить файл такого типа:
Абрамова,Валентина,Александровна,27/11/1949,50041088828891,Заключение брака,отдел ЗАГС
АКИМОВ,СЕРГЕЙ,ВАСИЛЬЕВИЧ,30/11/1983,50041088828063,Заключение брака,отдел ЗАГС
АКИМОВ,СЕРГЕЙ,ВАСИЛЬЕВИЧ,30/11/1983,50041088828063,Расторжение брака,отдел ЗАГС
АЛЕШКОВА,ОЛЬГА,СЕРГЕЕВНА,22/12/1975,50041088829728,Заключение брака,отдел ЗАГС
АЛЕШКОВА,ОЛЬГА,СЕРГЕЕВНА,22/12/1975,50041088829728,Заключение брака,отдел ЗАГС
АЛЕШКОВА,ОЛЬГА,СЕРГЕЕВНА,22/12/1975,50041088829728,Расторжение брака,отдел ЗАГС
Батышкина,Ольга,Владимировна,03/04/1987,50041088830114,Заключение брака,отдел ЗАГС
Безрукова,Ольга,Николаевна,03/04/1983,50041088824428,Заключение брака,отдел ЗАГС
Евенко,Алексей,Сергеевич,07/05/1985,50041088822689,Смерть,Специализиров анный отдел регистрации актов гражданского состояния о смерти

По полям таблицы
Фамили Имя Отчество Дата_рождения(причем дд.мм.гггг) ID Информация(все, что после ID)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2015, 06:55
Ответы с готовыми решениями:

Нужно распарсить файл docx
использовать будем python3.

Содержимое каждой страницы распарсить с помощью BeautifulSoup и сохранить всё в файл
Добрый день! Пытаюсь парсить сайт, на котором информация выводится по 30 записей на страницу, всего ~1000. Для получения ссылок есть...

Как распарсить json?
Как можно получить данные ч/з пост запрос библиотеки requests? Нужно значение ключа 'n'

34
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
09.05.2015, 10:45  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 0x10 Посмотреть сообщение
Научиться пользоваться отладчиком. Или отладочной печатью. Серьезно. Мало кому захочется ковыряться в 170 строках кода, написанного настолько небрежно, да еще и при том, что недостаточно данных для воспроизведения проблемы: отсутствуют пользовательские модули, нет входных данных, скрипта создания базы и т. д.
Модули не нужны, так как в них только строки соединения к базам и пароли, данные написаны в начале темы...если вы потратили несколько лет на изучение питона, то я вас поздравляю, я только-только начал им заниматься...
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
09.05.2015, 11:43
Safer54rus, чудак человек. Тебе сказали в чем ты не прав, а ты ерунду какую-то несёшь. Вот вообще 0x10 на 100% во всем прав и я с ним согласен.
Когда код на форум выкладываешь, нужно выложить вспомогательные модули, бд и т д или убрать из кода все лишнее и оставить только проблемный участок, чтобы было проще тебе-же помочь.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.05.2015, 13:50
Я начал было писать большой пост с разбором всех косяков кода, а потом махнул рукой: все равно потенциально можно упереться в базу, которой нет.
Поэтому только отмечу пару очевидных косяков.
1. Функция получения содержимого файлов — один сплошной баг. Во-первых, она обходит все файлы в каталоге, хотя этот же обход реализован в вызывающем коде. Приводит это к тому, что одни и те же записи потециально могли бы вставляться множество раз. Спасает от этого тот факт, что обработанные файлы переименовываюся, что не делает функцию более корректной.
2. В этой же функции поле text каждой записи содержит конкатенацию всех хвостов всех записей. Явно не то, чего хотелось.
3. Отрезание первых полей и склеивание последних реализовано огромным сложным куском кода.

Примерный вид функции, с которым еще как-то можно работать привожу ниже. Детали реализации можно добавить по вкусу:
Python
1
2
3
4
5
6
7
8
9
10
11
def get_file_content(filename):
    fieldnames = ['SURNAME', 'NAME', 'PATRONIMYC', 'DBTR_BORN', 'QueryKey']
    restkey = 'Text'
    result = []
    with open(filename) as csvfile:
        reader = csv.DictReader(csvfile, fieldnames, restkey)
        for row in reader:
            row['Text'] = ', '.join(row['Text'])
            result.append(row)
 
    return result
Понятно, что проблему это не решает.
Автору: сначала локализуй где проблема: в питоньем коде или при вставке в базу. В определенный момент в коде есть участок, где доступен список sql-запросов для вставки. Техника отладки такая:
1. Подготовить базу. Пустую.
2. Подготовить входные файлы. Три файла, по две строчки в каждом. Достаточно маленькие значения, чтобы можно было читать глазами.
3. В коде вывести все запросы к базе. Убедиться, что они соответствуют ожидаемым, т.е. присутствуют все записи.
4. Посмотреть в базу: все ли записи были добавлены.

На этом этапе можно понять где происходит ошибка и разбираться с ней: либо не все записи получаем, либо не все вставляем. Что-то более конкретное тут сказать сложно.
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 06:25  [ТС]
0x10, я знаю, что код баганый, но что вы ожидаете от новичка?
Объединил всё в одну процедуру, но при этом выдаёт:
File "D:\obmen\zags_response .py", line 105, in file_pars
cursor.execute(bl_insert_input_header_sc r.format(line,seq_pack,seq_num))
TypeError: string indices must be integers
Я так понимаю, что где-то я ошибся с типами, только не могу понять где
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    
import odbc
db=odbc.odbc(conn_str)
cursor=db.cursor()
seq_num=0
seq_pack=0
seq_doc=0
mp_sq_dict=[]
name1=''
st=''
stop_list=['1','2','3','4','5']
keys=['1','2','3','4','5','6','7','8', '9','10']
    blanc_dict=dict.fromkeys(['SURNAME','NAME','PATRONIMYC','DBTR_BORN','QueryKey','Text','Req_Date','Filename','seq_doc'])
ret_dict_list=[]
blanc_dict['seq_doc']=0
   for file in os.listdir(file_folder):
        if file.startswith('f'):
            name1=file
            print(name1)
            for line in open(file_folder+os.sep+name1):
                dict_=dict(zip((keys),(line.split(','))))
                blanc_dict['SURNAME']=dict_['1']
                blanc_dict['NAME']=dict_['2']
                blanc_dict['PATRONIMYC']=dict_['3']
                blanc_dict['Filename']=file
                blanc_dict['DBTR_BORN']=dict_['4']
                blanc_dict['QueryKey']=dict_['5']
                blanc_dict['Req_Date']=(datetime.datetime.now()).strftime('%d.%m.%Y')
                blanc_dict['seq_doc']+=1
                print(blanc_dict['seq_doc'])
                for key in dict_:
                    if key not in stop_list:
                        st+=dict_[key]+', '
                        #print(st)
                blanc_dict['Text']=st
                #print(line)
                ret_dict_list+=blanc_dict,
                #print(line)
                db=odbc.odbc(conn_str)
                cursor=db.cursor()
                #скрипт для получения номера крайнего пакета для савокупности (AGENT_CODE, AGENT_DEPT_CODE, AGENT_AGREEMENT_CODE)
                max_pack_num="select max(PACK_NUMBER) from ext_input_header where agent_code = 'ЗАГС' and agent_agreement_code='ЗАГС_СОГЛ' and agent_dept_code='ЗАГС_ПОДР'"
                #print('резервируем номера для новых документов')
                cursor.execute('select gen_id(seq_document,1) FROM RDB$DATABASE')
                seq_doc_start=cursor.fetchall()
                seq_doc_start=seq_doc_start[0][0]
##    
                cursor.execute(max_pack_num)
                res=cursor.fetchall()
                #важно если пакетов нет, создаем первый
                max_=(1 if res[0][0]==None else res[0][0])
                db.close()
                print('номер пакета', max_+1)
                mp_sq_dict=dict(zip(("pack_num","start_seq"),(max_+1,seq_doc_start)))
                seq_pack=int(mp_sq_dict['pack_num'])
                seq_num=int(mp_sq_dict['start_seq']) 
                cursor.execute(bl_insert_input_header_scr.format(line,seq_pack,seq_num))
                cursor.execute(bl_resp.format(line,seq_num))
Добавлено через 38 минут
Python
1
2
3
4
bl_insert_input_header_scr="INSERT INTO EXT_INPUT_HEADER (ID, PACK_NUMBER, PROCEED, AGENT_CODE, AGENT_DEPT_CODE, AGENT_AGREEMENT_CODE, EXTERNAL_KEY, METAOBJECTNAME, DATE_IMPORT)\
VALUES ({2}, {1}, 0, 'ЗАГС', 'ЗАГС_ПОДР', 'ЗАГС_СОГЛ', {0[QueryKey]}, 'EXT_RESPONSE', '{0[Req_Date]}');"
bl_resp="INSERT INTO EXT_RESPONSE (ID, RESPONSE_DATE, ENTITY_NAME, ENTITY_BIRTHYEAR, ENTITY_BIRTHDATE,ENTITY_INN, ID_NUM, IP_NUM, REQUEST_NUM, REQUEST_ID, DATA_STR,ANSWER_TYPE)\
VALUES ({1}, '{0[Req_Date]}', 'Загс', NULL, NULL, NULL, NULL, NULL, '{0[QueryKey]}', {0[QueryKey]}, '{0[Text]}','02');"
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 07:34
Первый аргумент - строка, а ты пытаешсья сделать с ним в строке формата вот это: {0[QueryKey]}
1
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 08:10  [ТС]
0x10, а подскажите, функцию очистки, а то ret_dict_list.clear() не работает
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 10:08
Цитата Сообщение от Safer54rus Посмотреть сообщение
а подскажите, функцию очистки, а то ret_dict_list.clear() не работает
ret_dict_list = []

А вообще это признак того, чтобы переписать код и минимизировать состояния. Декомпозиция на функции тут поможет.
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 11:13  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
ret_dict_list = []
тоже не обнуляет, использовал blanc_dict['1','10']=[]

Добавлено через 26 минут
Выдаёт
f21A4400.104
номер пакета 2
1
2
Traceback (most recent call last):
File "D:\obmen\zags_response .py", line 198, in <module>
main()
File "D:\obmen\zags_response .py", line 189, in main
file_pars(file_folder)
File "D:\obmen\zags_response .py", line 109, in file_pars
cursor.execute(bl_insert_input_header_sc r.format(line,seq_pack,seq_num))
dbi.integrityError: [ODBC Red Database Driver][Red Database]violation of PRIMARY or UNIQUE KEY constraint "PK_EXT_INPUT_HEADER" on table "EXT_INPUT_HEADER"
Problematic key value is ("ID" = 50041100939440) in EXEC
Хотя вторую запись вставляет
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 11:36
Цитата Сообщение от Safer54rus Посмотреть сообщение
тоже не обнуляет, использовал blanc_dict['1','10']=[]
Использование кортежа в качестве ключа - то, чего и хотелось?
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 11:44  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Использование кортежа в качестве ключа - то, чего и хотелось?
Не понял предложения
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.05.2015, 11:54
Тебя спрашивают: "Ты понимаешь, что делает эта строка?"
Цитата Сообщение от Safer54rus Посмотреть сообщение
тоже не обнуляет, использовал blanc_dict['1','10']=[]
Эта строка создаёт в словаре запись, где ключ это кортеж, а значение пустой список.

Python
1
2
3
4
5
>>> blanc_dict = {}
>>> blanc_dict['1','10'] = []
>>> blanc_dict
{('1', '10'): []}
>>>
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 12:58  [ТС]
alex925, и в какую часть это вставлять? чем плохо "blanc_dict['1','10']=[]"? в справочнике именно так написано, без всего остального

Добавлено через 57 минут
Последняя проблема, в blanc_dict['Text']=st вставляет всю информациюпосле поля ID со всех строк, как это исправить?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 13:10
Цитата Сообщение от Safer54rus Посмотреть сообщение
Последняя проблема, в blanc_dict['Text']=st вставляет всю информациюпосле поля ID со всех строк, как это исправить?
В 31 строке к переменной st постоянно добавляется содержимое. Я об этом сказал несколько постов назад, а в 23 посте привел пример кода как могла бы выглядеть функция разбора файла.

Проблема опять та же самая - введено дополнительное состояние, из-за которого возникают ошибки.
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 13:22  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Проблема опять та же самая - введено дополнительное состояние, из-за которого возникают ошибки.
Поясните пожалуйста
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 13:25
Цитата Сообщение от Safer54rus Посмотреть сообщение
Поясните пожалуйста
Есть куча глобальных переменных, среди которых и st. По задумке эти переменные должны быть локальными, т.е. область видимосит должна быть ограничена блоком обработки одной записи.

Сейчас же это глобалки, которые сохраняют свое значение от обработки одной записи к другой. Отсюда и проблемы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2015, 13:25

Распарсить выхлоп objdump
пример выхлопа: хотелось бы 2(1) функции(вообще поидеи класс думаю был бы лучше, но это наверное сложнее) def...

Как распарсить json?
Здравствуйте! Имеется json-файл: Необходимо: 1. Проверить есть ли в этой строке подстрока, где 'type':...

Как распарсить динамическую таблицу?
Здравствуйте. Пытаюсь разобраться в парсинге страниц. Остановился пока на простой BeautifulSoup4 (Python3). Позже думаю на Scrapy перейти. ...

Распарсить текстовый файл
Есть файл1.txt или просто файл с информацией (очень много строк), пример куска файла: $о ¦1211¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦ Dev=1; ...

Распарсить файл с шифрованием
Здравствуйте! Не получается расшифровать файл ubx, чтобы потом его распарсить по битам, пробовал разные кодировки, должна подойти hex. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru