Уведомления

Группа в Telegram: @pythonsu

#1 Июль 23, 2014 15:10:21

ppp3
Зарегистрирован: 2014-07-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с файлами строками и числами Помогите

Есть файл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)

Офлайн

#2 Июль 23, 2014 23:45:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа с файлами строками и числами Помогите

#!/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)

Офлайн

#3 Июль 24, 2014 11:02:34

ppp3
Зарегистрирован: 2014-07-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с файлами строками и числами Помогите

Спасибо большое за помощь. Есть пара вопросов
1. Информация по text1 =“”“ , text2 = ”“” находится в коде, а у меня два отдельных фала text1 и text2 по 2500 строк. Как сделать так, что бы скрипт брал информацию из двух файлов text1.txt и text2.txt
И полученный результат выводил в новый созданный файл text3.txt ?

Отредактировано ppp3 (Июль 24, 2014 11:28:18)

Офлайн

#4 Июль 24, 2014 11:52:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа с файлами строками и числами Помогите

Вообще, нужно читать файл частями, состоящими из какого-то количества полных блоков, потому что блоков теоретически может быть миллион.

Но, если на первое время, то подойдёт чтение файла целиком.

Чтение:

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)



Офлайн

#5 Июль 25, 2014 08:50:28

ppp3
Зарегистрирован: 2014-07-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с файлами строками и числами Помогите

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

Офлайн

#6 Июль 25, 2014 10:12:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа с файлами строками и числами Помогите

#!/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]$



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version