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

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

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

Author24 — интернет-сервис помощи студентам
Помогите разбить файл такого типа:
Абрамова,Валентина,Александровна,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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2015, 06:55
Ответы с готовыми решениями:

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

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

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

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

34
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
09.05.2015, 10:45  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 0x10 Посмотреть сообщение
Научиться пользоваться отладчиком. Или отладочной печатью. Серьезно. Мало кому захочется ковыряться в 170 строках кода, написанного настолько небрежно, да еще и при том, что недостаточно данных для воспроизведения проблемы: отсутствуют пользовательские модули, нет входных данных, скрипта создания базы и т. д.
Модули не нужны, так как в них только строки соединения к базам и пароли, данные написаны в начале темы...если вы потратили несколько лет на изучение питона, то я вас поздравляю, я только-только начал им заниматься...
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
09.05.2015, 11:43 22
Safer54rus, чудак человек. Тебе сказали в чем ты не прав, а ты ерунду какую-то несёшь. Вот вообще 0x10 на 100% во всем прав и я с ним согласен.
Когда код на форум выкладываешь, нужно выложить вспомогательные модули, бд и т д или убрать из кода все лишнее и оставить только проблемный участок, чтобы было проще тебе-же помочь.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.05.2015, 13:50 23
Я начал было писать большой пост с разбором всех косяков кода, а потом махнул рукой: все равно потенциально можно упереться в базу, которой нет.
Поэтому только отмечу пару очевидных косяков.
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  [ТС] 24
0x10, я знаю, что код баганый, но что вы ожидаете от новичка?
Объединил всё в одну процедуру, но при этом выдаёт:
File "D:\obmen\zags_response .py", line 105, in file_pars
cursor.execute(bl_insert_input_header_scr.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
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 07:34 25
Первый аргумент - строка, а ты пытаешсья сделать с ним в строке формата вот это: {0[QueryKey]}
1
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 08:10  [ТС] 26
0x10, а подскажите, функцию очистки, а то ret_dict_list.clear() не работает
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 10:08 27
Цитата Сообщение от Safer54rus Посмотреть сообщение
а подскажите, функцию очистки, а то ret_dict_list.clear() не работает
ret_dict_list = []

А вообще это признак того, чтобы переписать код и минимизировать состояния. Декомпозиция на функции тут поможет.
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 11:13  [ТС] 28
Цитата Сообщение от 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_scr.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
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.05.2015, 11:36 29
Цитата Сообщение от Safer54rus Посмотреть сообщение
тоже не обнуляет, использовал blanc_dict['1','10']=[]
Использование кортежа в качестве ключа - то, чего и хотелось?
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
12.05.2015, 11:44  [ТС] 30
Цитата Сообщение от 0x10 Посмотреть сообщение
Использование кортежа в качестве ключа - то, чего и хотелось?
Не понял предложения
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.05.2015, 11:54 31
Тебя спрашивают: "Ты понимаешь, что делает эта строка?"
Цитата Сообщение от 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  [ТС] 32
alex925, и в какую часть это вставлять? чем плохо "blanc_dict['1','10']=[]"? в справочнике именно так написано, без всего остального

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

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

Сейчас же это глобалки, которые сохраняют свое значение от обработки одной записи к другой. Отсюда и проблемы.
1
12.05.2015, 13:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2015, 13:25
Помогаю со студенческими работами здесь

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

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

Распарсить текстовый файл
Есть файл1.txt или просто файл с информацией (очень много строк), пример куска файла: $о...

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

Распарсить json файл
Принимаю файл json , &quot;guidislink&quot;: false, &quot;id&quot;:...

Как распарсить этот файл
Здравствуйте. Есть вот такой файл: ...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru