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

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

06.05.2015, 06:55. Показов 5554. Ответов 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
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.05.2015, 07:04
Делаешь с каждой строкой
Python
1
str.split(',')
и получаешь, что тебе надо
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
06.05.2015, 07:05  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Делаешь
Код Python
1
str.split(',')
и получаешь, что тебе надо
но там же есть запятые как раз и в информации, которую надо заносить скопом
да и дата не в таком формате
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.05.2015, 07:09
Цитата Сообщение от Safer54rus Посмотреть сообщение
но там же есть запятые как раз и в информации, которую надо заносить скопом
Формат так себе.
Нужно сначала все разрезать по разделителям. Взять первые N объектов, а оставшиеся поджойнить в одну строку.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.05.2015, 07:18
Цитата Сообщение от Safer54rus Посмотреть сообщение
но там же есть запятые как раз и в информации, которую надо заносить скопом
Про это тебе уже 0x10 сказал
Цитата Сообщение от Safer54rus Посмотреть сообщение
да и дата не в таком формате
Ну, а сам догадаться, что нужно состряпать функцию, которая уже будет получать отдельно дату и переводить её в другой формат ты сам догадаться не можешь?

Добавлено через 33 секунды
Такое ощущение, что ты кому-то тут платил и не доволен результатом
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
06.05.2015, 07:57  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Нужно сначала все разрезать по разделителям. Взять первые N объектов, а оставшиеся поджойнить в одну строку.
Вот именно это я и не знаю как сделать
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.05.2015, 08:04
Как-то так:
Python
1
2
3
4
5
def get_n(s, n, delimiter)
   r = s.split(delimiter)
   last = delimiter.join(r[n:])
   result = r[:n] + [last]
   return result
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
06.05.2015, 11:01  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Как-то так:
Код Python
1
2
3
4
5
def get_n(s, n, delimiter)
r = s.split(delimiter)
last = delimiter.join(r[n:])
result = r[:n] + [last]
return result
не понимаю...я в питоне практически ноль
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.05.2015, 11:10
Safer54rus,
Функция разбивает строку (одну), как вы хотите. Комментировать не буду, ибо тут используются элементарные конструкции, про которые можно посмотреть в хелпе. Не буду же я пересказывать хелп. Хитрой логики, требующей осмысления, также никакой нет.
split, join, индексация списков, сложение списков.
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
06.05.2015, 12:53  [ТС]
dondublon, может объясните мне как пользоваться ключами и списком лучше?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.05.2015, 12:54
Какими ключами? Насчёт списков - посмотрите в инете. Там ТЫЩИ мануалов. Поискать за вас?
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
06.05.2015, 13:01  [ТС]
dondublon, ну попробуйте, я не нашёл подходящего
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.05.2015, 13:05
Safer54rus, судя по вопросам начинай вот с этого http://younglinux.info/python/... python.php, потом скачивай книгу "Марк Лутц Изучаем python" и читай её (что интересует, ну, а лучше по порядку).

У тебя вопросы возникают на ровном месте по базовым вещам. Тут тебе ни кто помочь не сможет, пока сам голову не включишь.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.05.2015, 13:08
Safer54rus, Выбирайте https://www.google.ru/search?q... e&ie=UTF-8
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
07.05.2015, 21:21  [ТС]
alex925, dondublon, добился от себя такого результата, правда с помощью, но всё равно не работает...
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import odbc
import os
import datetime
import rarfile
import ftplib
import dbi
import info
import functions
import dbi
file_folder=os.getcwd()+os.sep+'zags'+os.sep+'in'
print('получаем ответы')
functions.get_response_zags(file_folder)
date_now=(datetime.datetime.now()).strftime("%d.%m.%Y")
#создаем список необработанных файлов возвращает список полных путей к файлу
def files_find():
    list_of_files=os.listdir(file_folder)
    f_list=[]
    for file in list_of_files:
        if file.startswith('f'):
            f_list+=(file_folder+os.sep+file),
    print(f_list)
    return(f_list)
 
#чистка от пробелов и спецсимволов        
def dict_clean(dict_):
    for key in dict_:
        dict_[key]=dict_[key].strip() if dict_[key]!=None else ''
    return(dict_)
#
keys=['SURNAME','NAME','PATRONIMYC','DBTR_BORN','QueryKey','Text','Req_Date','Filename']
#Читаем ini настройки
import functions
obmen_ini_dict=functions.read_ini('obmen.ini','OBMEN')
server_ip=obmen_ini_dict['server_ip']
database=obmen_ini_dict['database']
conn_str=conn_str=functions.conn_str_create()
#print(conn_str)
#
 
##Считываем файлы
def file_read(dict_):
    text=str()
    filename=dict_['Filename']
    for line in open(file_folder+os.sep+filename):
        text+=line
    print(text)    
    return(text)
##
 
def file_pars(file_folder):
    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'])
    ret_dict_list=[] 
    for file in os.listdir():
        #print(filename)
        if file.startswith('f'):
            for line in open(file):
                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')
                #Чистим от ненужных символов
                for key in dict_:
                    if key not in list_keys:
                       st+=dict_[key]+', '
                blanc_dict['Text']=st
                ret_dict_list+=dict_,
                print[ret_dict_list]
 
#Презервируем номера для insert
def max_pack_start_seq(count_rec):
    import odbc
    seq_doc=[]
    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('select gen_id(seq_document,'+str(int(count_rec))+') FROM RDB$DATABASE')
    seq_doc_end=cursor.fetchall()
    seq_doc_end=seq_doc_end[0][0]
    print('зарезервированы номера с',seq_doc_start,'по',seq_doc_end)
##    
    print('задаем номер пакета уникальный для савокупности (AGENT_CODE, AGENT_DEPT_CODE, AGENT_AGREEMENT_CODE)')
    cursor.execute(max_pack_num)
    res=cursor.fetchall()
    #важно если пакетов нет, создаем первый
    max_=(1 if res[0][0]==None else res[0][0]+1)
    db.close()
    print('номер пакета', max_)
    return_dict=dict(zip(("pack_num","start_seq"),(max_,seq_doc_start)))
    return(return_dict)
 
#составляем строчку с из бланка для inserta
def insert_do(files_list):
    insert_list=[]
    #бланк для заполнения
    mp_sq_dict=max_pack_start_seq(len(xml_files_list))
    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');"
    for line in files_list:
        seq_num=int(mp_sq_dict['start_seq']+line['seq_doc'])
        insert_inp_head=bl_insert_input_header_scr.format(line,mp_sq_dict['pack_num'],seq_num)
        insert_request=bl_resp.format(line,seq_num)
        #Лист вставки
        insert_list+={'insert_header':insert_inp_head,'insert_request':insert_request},
    return(insert_list)
 
##загрузка непосредственно в базу    
def insert_db(list_ins):
    import odbc
    count=0
    sc=0
    db=odbc.odbc(conn_str)
    cursor=db.cursor()
    for line in list_ins:
        sc+=1
        try:
            cursor.execute(line['insert_header'])
            cursor.execute(line['insert_request'])
        except Exception as err:
            print(err)
        if sc==100:
            count+=sc
            sc=0
            print('[',count,'/',len(list_ins),']')
    count=count+sc
    print('добавленно ',count,' ответов')
 
 
##добавить переименование прочтенных файлов
def main():
    for filename in files_find():
        print(filename)
        file_dir,file_name=os.path.split(filename)
        if not os.path.exists(os.path.join(file_dir,'ok_'+file_name)):
            files_list=file_pars(file_folder)
            insert_dict_list=insert_do(files_list)            
            insert_db(insert_dict_list)
            try:
                os.rename(filename,os.path.join(file_dir,'ok_'+file_name))
                print('Файл переименован')
            except Exception as exc:
                print('can''t do this: ',exc)
        else:
            os.remove(filename)
##
main()
Вот, собственно, сами ошибки
Traceback (most recent call last):
File "D:\obmen\zags_response.py", line 159, in <module>
main()
File "D:\obmen\zags_response.py", line 148, in main
files_list=file_pars(file_folder)
File "D:\obmen\zags_response.py", line 59, in file_pars
for line in open(file):
Добавлено через 1 час 46 минут
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import odbc
import os
import datetime
import rarfile
import ftplib
import dbi
import info
import functions
import dbi
k=0
file_folder=os.getcwd()+os.sep+'zags'+os.sep+'in'
print('получаем ответы')
functions.get_response_zags(file_folder)
date_now=(datetime.datetime.now()).strftime("%d.%m.%Y")
#создаем список необработанных файлов возвращает список полных путей к файлу
def files_find():
    list_of_files=os.listdir(file_folder)
    f_list=[]
    for file in list_of_files:
        if file.startswith('f'):
            f_list+=(file_folder+os.sep+file),
    print(f_list)
    return(f_list)
 
#чистка от пробелов и спецсимволов        
def dict_clean(dict_):
    for key in dict_:
        dict_[key]=dict_[key].strip() if dict_[key]!=None else ''
    return(dict_)
#
keys=['SURNAME','NAME','PATRONIMYC','DBTR_BORN','QueryKey','Text','Req_Date','Filename']
#Читаем ini настройки
import functions
obmen_ini_dict=functions.read_ini('obmen.ini','OBMEN')
server_ip=obmen_ini_dict['server_ip']
database=obmen_ini_dict['database']
conn_str=conn_str=functions.conn_str_create()
#print(conn_str)
#
 
##Считываем файлы
def file_read(dict_):
    text=str()
    filename=dict_['Filename']
    for line in open(file_folder+os.sep+filename):
        text+=line
    print(text)    
    return(text)
##
 
def file_pars(file_folder):
    k=0
    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'])
    ret_dict_list=[] 
    #file=os.getcwd()+os.sep+'f2.txt'
    for file in os.listdir():
        if file.startswith('f')& file.endswith('.104'):
            name1=file
            print(name1)
            for line in open(name1):
                k+=1
                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')
                #Чистим от ненужных символов
                for key in dict_:
                    if key not in stop_list:
                        st+=dict_[key]+', '
                        #print(st)
                blanc_dict['Text']=st
            
                ret_dict_list+=blanc_dict,
                for line in ret_dict_list:
                    print(line)
 
 
#Презервируем номера для insert
def max_pack_start_seq(count_rec):
    import odbc
    seq_doc=[]
    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('select gen_id(seq_document,'+str(int(count_rec))+') FROM RDB$DATABASE')
    seq_doc_end=cursor.fetchall()
    seq_doc_end=seq_doc_end[0][0]
    print('зарезервированы номера с',seq_doc_start,'по',seq_doc_end)
##    
    print('задаем номер пакета уникальный для савокупности (AGENT_CODE, AGENT_DEPT_CODE, AGENT_AGREEMENT_CODE)')
    cursor.execute(max_pack_num)
    res=cursor.fetchall()
    #важно если пакетов нет, создаем первый
    max_=(1 if res[0][0]==None else res[0][0]+1)
    db.close()
    print('номер пакета', max_)
    return_dict=dict(zip(("pack_num","start_seq"),(max_,seq_doc_start)))
    return(return_dict)
 
#составляем строчку с из бланка для inserta
def insert_do(files_list):
    insert_list=[]
    #бланк для заполнения
    #mp_sq_dict=max_pack_start_seq(len(xml_files_list))
    mp_sq_dict=max_pack_start_seq(k)
    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');"
    for line in files_list:
        seq_num=int(mp_sq_dict['start_seq']+line['seq_doc'])
        insert_inp_head=bl_insert_input_header_scr.format(line,mp_sq_dict['pack_num'],seq_num)
        insert_request=bl_resp.format(line,seq_num)
        #Лист вставки
        insert_list+={'insert_header':insert_inp_head,'insert_request':insert_request},
    return(insert_list)
 
##загрузка непосредственно в базу    
def insert_db(list_ins):
    import odbc
    count=0
    sc=0
    db=odbc.odbc(conn_str)
    cursor=db.cursor()
    for line in list_ins:
        sc+=1
        try:
            cursor.execute(line['insert_header'])
            cursor.execute(line['insert_request'])
        except Exception as err:
            print(err)
        if sc==100:
            count+=sc
            sc=0
            print('[',count,'/',len(list_ins),']')
    count=count+sc
    print('добавленно ',count,' ответов')
 
 
##добавить переименование прочтенных файлов
def main():
    for filename in files_find():
        print(filename)
        file_dir,file_name=os.path.split(filename)
        if not os.path.exists(os.path.join(file_dir,'ok_'+file_name)):
            files_list=file_pars(file_folder)
            insert_dict_list=insert_do(files_list)            
            insert_db(insert_dict_list)
            try:
                os.rename(filename,os.path.join(file_dir,'ok_'+file_name))
                print('Файл переименован')
            except Exception as exc:
                print('can''t do this: ',exc)
        else:
            os.remove(filename)
##
main()
С одним разобрался, теперь проблема в том, что не правильно формирует file_list

Traceback (most recent call last):
File "D:\obmen\zags_response .py", line 170, in <module>
main()
File "D:\obmen\zags_response .py", line 160, in main
insert_dict_list=insert_do(files_list)
File "D:\obmen\zags_response .py", line 123, in insert_do
for line in files_list:
TypeError: 'NoneType' object is not iterable
Собственно, все последующие ошибки из-за этого
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.05.2015, 04:06
Цитата Сообщение от Safer54rus Посмотреть сообщение
С одним разобрался, теперь проблема в том, что не правильно формирует file_list
Цитата Сообщение от Safer54rus Посмотреть сообщение
files_list=file_pars(file_folder)
Функция file_pars ничего не возвращает.
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
08.05.2015, 05:12  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Функция file_pars ничего не возвращает.
это я тоже уже увидел...только он почему-то возвращает пустой список, то есть не может прочитать файл
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.05.2015, 06:30
Цитата Сообщение от Safer54rus Посмотреть сообщение
это я тоже уже увидел
Ок, если увидел - можешь исправить.
Цитата Сообщение от Safer54rus Посмотреть сообщение
только он почему-то возвращает пустой список,
Кто "он" и куда возвращает?
0
2 / 2 / 1
Регистрация: 31.05.2014
Сообщений: 169
08.05.2015, 12:02  [ТС]
0x10,
Не правильно задавал путь к файлу...правда теперь
Traceback (most recent call last):
File "D:\obmen\zags_response .py", line 170, in <module>
main()
File "D:\obmen\zags_response .py", line 159, in main
files_list=file_pars(file_folder)
File "D:\obmen\zags_response .py", line 63, in file_pars
for line in open(file_folder+os.sep+name1):
File "C:\Python32\lib\encodings\cp1251.py ", line 23, in decode
return codecs.charmap_decode(input,self.errors, decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 592: character maps to <undefined>
Выдаёт

Добавлено через 48 минут
Изначально файл в csv, а когда пересораняешь в txt, то нормально отрабатывает

Добавлено через 4 часа 28 минут
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#-*- encoding cp1251 -*-
import odbc
import os
import datetime
import rarfile
import ftplib
import dbi
import info
import functions
k=0
file_folder=os.getcwd()+os.sep+'zags'+os.sep+'in'
print('получаем ответы')
functions.get_response_zags(file_folder)
date_now=(datetime.datetime.now()).strftime("%d.%m.%Y")
#создаем список необработанных файлов возвращает список полных путей к файлу
def files_find():
    list_of_files=os.listdir(file_folder)
    f_list=[]
    for file in list_of_files:
        if file.startswith('f'):
            f_list+=(file_folder+os.sep+file),
    print(f_list)
    return(f_list)
 
#чистка от пробелов и спецсимволов        
def dict_clean(dict_):
    for key in dict_:
        dict_[key]=dict_[key].strip() if dict_[key]!=None else ''
    return(dict_)
#
keys=['SURNAME','NAME','PATRONIMYC','DBTR_BORN','QueryKey','Text','Req_Date','Filename','seq_doc']
#Читаем ini настройки
obmen_ini_dict=functions.read_ini('obmen.ini','OBMEN')
server_ip=obmen_ini_dict['server_ip']
database=obmen_ini_dict['database']
conn_str=conn_str=functions.conn_str_create()
#print(conn_str)
#
 
##Считываем файлы
def file_read(dict_):
    text=str()
    filename=dict_['Filename']
    for line in open(file_folder+os.sep+filename):
        text+=line
    #print(text)    
    return(text)
##
 
def file_pars(file_folder):
    k=0
    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=[] 
    #file=os.getcwd()+os.sep+'f2.txt'
    for file in os.listdir(file_folder):
        if file.startswith('f'):
            name1=file
            print(name1)
            for line in open(file_folder+os.sep+name1):
                k+=1
                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']=k
                #Чистим от ненужных символов
                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,
    return(ret_dict_list)
 
 
#Презервируем номера для insert
def max_pack_start_seq(count_rec):
    import odbc
    seq_doc=[]
    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('select gen_id(seq_document,'+str(int(count_rec))+') FROM RDB$DATABASE')
    seq_doc_end=cursor.fetchall()
    seq_doc_end=seq_doc_end[0][0]
    print('зарезервированы номера с',seq_doc_start,'по',seq_doc_end)
##    
    print('задаем номер пакета уникальный для савокупности (AGENT_CODE, AGENT_DEPT_CODE, AGENT_AGREEMENT_CODE)')
    cursor.execute(max_pack_num)
    res=cursor.fetchall()
    #важно если пакетов нет, создаем первый
    max_=(1 if res[0][0]==None else res[0][0]+1)
    db.close()
    print('номер пакета', max_)
    return_dict=dict(zip(("pack_num","start_seq"),(max_,seq_doc_start)))
    return(return_dict)
 
#составляем строчку с из бланка для inserta
def insert_do(files_list):
    n=0
    insert_list=[]
    #бланк для заполнения
    #mp_sq_dict=max_pack_start_seq(len(xml_files_list))
    mp_sq_dict=max_pack_start_seq(len(files_list))
    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');"
    for line in files_list:
        seq_num=int(mp_sq_dict['start_seq']+line['seq_doc'])
        n+=1
        insert_inp_head=bl_insert_input_header_scr.format(line,mp_sq_dict['pack_num'],seq_num)
        insert_request=bl_resp.format(line,seq_num)
        #Лист вставки
        insert_list+={'insert_header':insert_inp_head,'insert_request':insert_request},
    return(insert_list)
 
##загрузка непосредственно в базу    
def insert_db(list_ins):
    import odbc
    count=0
    sc=0
    db=odbc.odbc(conn_str)
    cursor=db.cursor()
    for line in list_ins:
        sc+=1
        try:
            cursor.execute(line['insert_header'])
            cursor.execute(line['insert_request'])
        except Exception as err:
            print(err)
        if sc==100:
            count+=sc
            sc=0
            print('[',count,'/',len(list_ins),']')
    count=count+sc
    print('добавленно ',count,' ответов')
 
 
##добавить переименование прочтенных файлов
def main():
    for filename in files_find():
        print(filename)
        file_dir,file_name=os.path.split(filename)
        if not os.path.exists(os.path.join(file_dir,'ok_'+file_name)):
            files_list=file_pars(file_folder)
            insert_dict_list=insert_do(files_list)            
            insert_db(insert_dict_list)
            try:
                os.rename(filename,os.path.join(file_dir,'ok_'+file_name))
                print('Файл переименован')
            except Exception as exc:
                print('can''t do this: ',exc)
        else:
            os.remove(filename)
##
main()
Добился вставки, но почему-то берёт только последние значения...подскажите, что можно сделать?
0
08.05.2015, 18:04

Не по теме:

Цитата Сообщение от Safer54rus Посмотреть сообщение
подскажите, что можно сделать?
Научиться пользоваться отладчиком. Или отладочной печатью. Серьезно. Мало кому захочется ковыряться в 170 строках кода, написанного настолько небрежно, да еще и при том, что недостаточно данных для воспроизведения проблемы: отсутствуют пользовательские модули, нет входных данных, скрипта создания базы и т. д.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2015, 18:04
Помогаю со студенческими работами здесь

Распарсить выхлоп 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. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru