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

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

06.05.2015, 06:55. Показов 5610. Ответов 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru