Форум сайта python.su
0
Доброго дня уважаемые специалисты!
Застрял в процессе изучения Питона на практическом примере парсинга из сырого .txt в табличный вид или .csv c перестановкой полей.
Последовательность: Читаю файл, выделяю регулярками, заношу в словарь, переставляю поля, пишу в файлы (выход, отсев).
Чувствую явно что-то делаю не так.
Укажите, если не трудно, на ошибки и направление действий в подобных задачах.
Код
import sys import re ### Входные данные test_str = (" (00401) МОСКВА Г., АТ \"СУПЕРБАНК\" ГЛВ ОФИС IABS/Клиент-Банк Изг:18.05.2017\n\n" " Сведения о работе счета c 18.05.2017 по 18.05.2017\n\n" "Cчет: 20202020202020202020 OОО \"РОГА И КОПЫТА\" ИНН: 999999999\n" "Остаток на начало периода: 49,481,968.81 Остаток на конец периода: 51,933,468.81\n" "------------------------------------------------------------------------------------------------------------------------\n" " Дата | Счет/ИНН | № док-та |Оп| МФО | Оборот Дебет | Оборот Кредит | Назначение платежа |\n" "------------------------------------------------------------------------------------------------------------------------\n" "18.05.2017|20208000904636134001|0000000211| 4|01013| 0.00| 364,001.00|00668 за подключение, регистра\n" " 09:05:23| ИНН 206921309| | | | | |ции и использование интернет с\n" " |\"SHIFO-NUR EXIMER\" о| | | | | |ог дог № 19_1919/1919 от 17.05\n" " |бщество с ограниченн| | | | | |.2017г.\n" "------------------------------------------------------------------------------------------------------------------------\n" "19.05.2017|20208000400575629001|0000000112| 4|01098| 0.00| 22,530.00|00644 п/о 100% согл. Дог №19_1\n" " 10:21:20| ИНН 303747364| | | | | |919/1920 от 30.06.2016 за услу\n" " |ОК \"ORIENT MARKETING| | | | | |ги телеф за май 2017г\n" "------------------------------------------------------------------------------------------------------------------------\n" "20.05.2017|20208000800418698001|0000000248| 4|00980| 0.00| 135,000.00|00668Оплата 100% за дебеторски\n" " 10:25:48| ИНН 303146954| | | | | |й задолжност по дог№ 19-1919/1\n" " |ООО \"SIGMA ТАТА\" | | | | | |921 25,05,2015г.\n" "------------------------------------------------------------------------------------------------------------------------\n" "20.05.2017|20208000100325098001|0000000237| 4|00478| 0.00| 80,000.00|00668 за интернет услуги 2017г\n" " 10:25:48| ИНН 302946972| | | | | | согл дог19_190/1922 от 09,02,\n" " |\"SUS BIN TAMIR\" MAS| | | | | |2017\n" "------------------------------------------------------------------------------------------------------------------------\n" "22.05.2017|23402000300100001010|0115600082| 4|00014| 0.00| 76,500.00|006024001228602628379501000750\n" " 10:39:53| ИНН 201122919| | | | | |49~203440363~268 офис ~оплата\n" " |Казначейство Министе| | | | | | 100% за апрель м-ц 2017г за и\n" " |рство Финансов ФРз | | | | | |нтернет к дог №191938/1923 от\n" " | | | | | | | 16,03,2017г . с/ф№2921 Р-7751\n" " | | | | | | |71 от 30.04.2017г. ; Ст. 42\n" " | | | | | | |.92.200\n" "------------------------------------------------------------------------------------------------------------------------") #filename = 'input_txt_1.txt' codepage = 'utf-8' look_org_inn = r"ИНН\s\d{9}" look_pay_date = r"\d{2}\.\d{2}\.\d{4}\|" look_pay_time = r"\d{2}\:\d{2}\:\d{2}\|" look_pay_sum = r"(\d*\,*\d{,3}\,\d{3}\.\d{2}\|)" look_org_rs = r"\|\d{20}\|" look_org_name = r"(?:\|[a-zA-Zа-яА-я\s/\"\/\-/\`]{20}\|)" look_pay_comment = r"(?:\|.[а-яА-Я\w\_\s/\./\,\№\%//\-\~\;]{29})" while True: try: #input_file = open(filename, 'r', encoding=codepage) ### Открываем из файла input_file = test_str ### из test_str except Exception: print("Error: ", sys.exc_info()[1], '...') filename = input('Enter correct file name! :') else: #file_content = input_file.read() ### Читаем файл file_content = input_file ### читаем из стринга ### Словари dic_org_inn = {} dic_pay_date = {} dic_pay_time = {} dic_pay_sum = {} dic_org_rs = {} dic_org_name = {} dic_pay_comment = {} ### Регулярки org_inn = re.findall(look_org_inn, file_content) pay_date = re.findall(look_pay_date, file_content) pay_time = re.findall(look_pay_time, file_content) pay_sum = re.findall(look_pay_sum, file_content) org_rs = re.findall(look_org_rs, file_content) org_name = re.findall(look_org_name, file_content) pay_comment = re.findall(look_pay_comment, file_content) ### проходим по строчно for item in org_inn: dic_org_inn["inn"] = item #print(dic_org_inn["inn"]) for item in pay_date: dic_pay_date["date"] = item #print(dic_pay_date["date"]) for item in pay_time: dic_pay_time["time"] = item #print(dic_pay_time) for item in pay_sum: dic_pay_sum["pay_sum"] = item #print(dic_pay_sum) for item in org_rs: dic_org_rs["rs"] = item #print(dic_org_rs) for num, item in enumerate(org_name, 1): dic_org_name["org_name"] = item #print(dic_org_name) for num, item in enumerate(pay_comment, 1): dic_pay_comment["pay_comment"] = item #print(dic_pay_comment) ### переставляем поля print(dic_org_inn["inn"], dic_pay_date["date"], dic_pay_time["time"], dic_pay_sum["pay_sum"], dic_org_rs["rs"], dic_org_name["org_name"], dic_pay_comment["pay_comment"]) ### Итоги print('>>> Найдено ИНН из 9 цифер всего: ' + str(len(org_inn)) + ' строк') print(' Найдено СЧЕТОВ из 20 цифер всего: ' + str(len(org_rs)) + ' строк') print(' Найдено ДАТА оплаты всего: ' + str(len(pay_date)) + ' строк') print(' Найдено ВРЕМЯ оплаты всего: ' + str(len(pay_time)) + ' строк') print(' Найдено СУММ оплат всего: ' + str(len(pay_sum)) + ' строк') print(' Найдено ОРГАНИЗАЦИЙ всего: ' + str(len(org_name)) + ' строк') print(' Найдено КОММЕНТОВ всего: ' + str(len(pay_comment)) + ' строк') ### Далее проверки и вывод в файлы sys.exit()
Офлайн
35
Насколько я понял, нужно считать таблицу. Я бы использовал следующий подход:
Если строка состоит только из ——, то входим в дополнительный цикл и построчно читаем до тех пор, пока не всретится снова строка из ——-. Каждую строку во внутреннем цикле прогоняем через split('|'), т.к. | - разделитель колонок. Все это, что происходит во внутреннем цикле, заносим в список, который очищается всякий раз, когда встречается строка из ——-. Этот список имеет вид [, , , , ,] и имеет длину числа колонок. После того, как встречается ———— мы выходим из этого внутреннего цикла и все то, что находится в каждом внутреннем списке объединяем с помощью ‘ ’.join(inner_list). Пример такого списка: [, , … ] – для каждого внутреннего и делается join. В итоге, после каждого ————, когда мы выходим из внутреннего цикла и делаем join, мы получаем список строк, отражающих содержимое ячеек. И без regexp. Каждую строку можно заносить в отдельный список. По окончании, имеем разгруженную таблицу…
Офлайн
ualish
сначала преобразуй в массив
lines = str(test_str).split('\n') tbl = [] for l in lines: lst = [ i for i in l.split('|') if i] if len(lst): tbl.append(lst) del lines for i in range(len(tbl)): print(i,len(tbl[i]),tbl[i])
Отредактировано vic57 (Авг. 30, 2017 09:52:50)
Офлайн