Форум сайта python.su
0
Есть файл1.txt или просто файл с информацией (очень много строк), пример куска файла:
$о
¦1211¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦
Dev=1;
D=¦65¦2¦9¦144¦1¦1¦255¦255¦0¦0¦0¦
F=-1;
EndDev;
……..
$з
¦1311¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦
Dev=1;
D=¦201¦2¦5¦136¦5¦1¦255¦255¦0¦0
F=-1;
EndDev;
и т.д.
Что Нужно
1. Взять значение 1211 1311 и записать в новый файл3.
2. а. Нужно взять 4-е значение (144) и * на 256 и к полученному числу + 9 (это 3-е значение). Получилось число 36873. И так далее
б. Нужно взять 4-е значение (136 ) и * на 256 и к полученному числу + 5 (это 3-е значение).
3. Есть второй файл2.txt где есть много строк и нужно найти строку с числом 36873. Выглядит она так:
11 , 2 , 36873 ; B ; 0 , 1 ; 0 , 1 , 1 , 22 , -1 ; 0 ; 0x0
Нужно взять из строки 4-е, 6-е значение, поставить 000 и 10-е 11-е значение. Получится - B100022-1 и записать в новый файл3.
Тут всегда ровное число строк и всегда все цифры на своих местах.
В итоге нужно что бы получился новый файл3 и по строкам лежало значене
1211 , B100022-1
1311 , B100033-1
Помогите пожалуйста реализовать.
Отредактировано ppp3 (Июль 23, 2014 15:23:17)
Офлайн
857
#!/usr/bin/env python3 import re def func1(bs, ls): pat = r'\$[^$]+EndDev;' fmt = '{}{}000{}{}' out = [] for i in re.findall(pat, bs): n1, n2 = func2(i) t = (n1, fmt.format(*func3(ls, n2))) out.append(t) return out def func2(s): pat = r'.*?¦(\d+)¦.*?D=¦\d+¦\d+¦(\d+)¦(\d+)¦' a, b, c = map(int, re.findall(pat, s, re.S)[0]) return a, c * 256 + b def func3(s, n): pat = r'[^\s,;]+' for i in filter(None, s.splitlines()): f = re.findall(pat, i) if int(f[2]) == n: return f[3], f[5], f[9], f[10] text1 = """ $о ¦1211¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦ Dev=1; D=¦65¦2¦9¦144¦1¦1¦255¦255¦0¦0¦0¦ F=-1; EndDev; $з ¦1311¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦ Dev=1; D=¦201¦2¦5¦136¦5¦1¦255¦255¦0¦0 F=-1; EndDev; """ text2 = """ 11 , 2 , 36873 ; B ; 0 , 1 ; 0 , 1 , 1 , 22 , -1 ; 0 ; 0x0 11 , 2 , 34821 ; C ; 0 , 2 ; 0 , 1 , 1 , 33 , -2 ; 0 ; 0x0 """ lst = func1(text1, text2) print(lst)
[guest@localhost py]$ ./txtcnt.py
[(1211, 'B100022-1'), (1311, 'C200033-2')]
[guest@localhost py]$
Отредактировано py.user.next (Июль 23, 2014 23:52:45)
Офлайн
0
Спасибо большое за помощь. Есть пара вопросов
1. Информация по text1 =“”“ , text2 = ”“” находится в коде, а у меня два отдельных фала text1 и text2 по 2500 строк. Как сделать так, что бы скрипт брал информацию из двух файлов text1.txt и text2.txt
И полученный результат выводил в новый созданный файл text3.txt ?
Отредактировано ppp3 (Июль 24, 2014 11:28:18)
Офлайн
857
Вообще, нужно читать файл частями, состоящими из какого-то количества полных блоков, потому что блоков теоретически может быть миллион.
Но, если на первое время, то подойдёт чтение файла целиком.
Чтение:
with open('file.txt', encoding='utf-8') as fin: text = fin.read()
with open('out.txt', 'w', encoding='utf-8') as fout: print('test', file=fout)
Офлайн
0
py.user.next
Подскажи что нужно изменить в коде, где text2 =
11 , 2 , 57454 ; B ; 0 , 1 ; 0 , 1 , 1 , 668 , -1 ; 0 ; 0x0
11 , 3 , 10240 ; F ; 0 , 1 ; 0 , 1 , 2 , 1251 , -1 ; 0 ; 0x0
что бы число B1000668-1 формировалось по другому ?
Нужно так:
если “В” и 9-е число “1” то нужно что бы запись была B1000668-1 Тоесть ставилось B1 000668 -1
если “F” и 9-е число “2” то нужно что бы запись была A1000125100 Тоесть ставилось A1 0001251 00
Офлайн
857
#!/usr/bin/env python3 import re def func1(bs, ls): pat = r'\$[^$]+EndDev;' fmt = '{}{}000{}{}' out = [] for i in re.findall(pat, bs): n1, n2 = func2(i) t = (n1, fmt.format(*func3(ls, n2))) out.append(t) return out def func2(s): pat = r'.*?¦(\d+)¦.*?D=¦\d+¦\d+¦(\d+)¦(\d+)¦' a, b, c = map(int, re.findall(pat, s, re.S)[0]) return a, c * 256 + b def func3(s, n): pat = r'[^\s,;]+' for i in filter(None, s.splitlines()): f = re.findall(pat, i) if int(f[2]) == n: t = func4(f[3], f[5], f[8], f[9], f[10]) return t def func4(a, b, c, d, e): if a == 'B' and c == '1': pass elif a == 'F' and c == '2': return 'A', b, d, '00' return a, b, d, e text1 = """ $о ¦1211¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦ Dev=1; D=¦65¦2¦9¦144¦1¦1¦255¦255¦0¦0¦0¦ F=-1; EndDev; $з ¦1311¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦ Dev=1; D=¦201¦2¦5¦136¦5¦1¦255¦255¦0¦0 F=-1; EndDev; $з ¦1411¦0.00¦0.00¦0.00¦0.00¦0¦2¦0¦ Dev=1; D=¦201¦2¦6¦137¦5¦1¦255¦255¦0¦0 F=-1; EndDev; """ text2 = """ 11 , 2 , 36873 ; B ; 0 , 1 ; 0 , 1 , 1 , 22 , -1 ; 0 ; 0x0 11 , 2 , 34821 ; C ; 0 , 2 ; 0 , 1 , 1 , 33 , -2 ; 0 ; 0x0 11 , 2 , 35078 ; F ; 0 , 3 ; 0 , 1 , 2 , 44 , -3 ; 0 ; 0x0 """ lst = func1(text1, text2) print(lst)
[guest@localhost txtcnt]$ ./txtcnt2.py
[(1211, 'B100022-1'), (1311, 'C200033-2'), (1411, 'A30004400')]
[guest@localhost txtcnt]$
Офлайн