Цикл по текстовому файлу для обработки данных в python - PullRequest
0 голосов
/ 03 мая 2020

У меня есть текстовый файл со следующими данными. Всего строк 162, содержащих одинаковые данные

0000
0000
0000
1111
2222
3333
3333
4444
5555
6666
7777
8888
0000
0000
0000
1111
2222
3333
3333
4444
5555
6666
7777
8888

Я хочу l oop для этого файла, найти шаблон данных «0000 0000 0000», который повторяется в 3 последовательных строках, и сохранить следующие строки. в списке для обработки данных. Это часть кода, который я написал. Здесь я проверяю, появляется ли 0000 в списке, как только я его получаю, я удаляю 3 последовательных шаблона и отправляю список для обработки данных, однако кажется, что logi c не работает, так как он принимает все данные следующего шаблона. тоже. Кто-нибудь может мне здесь помочь?

match = 0000
values = []
bit_file = open(filename, 'rb')
for line in bit_file:
    values.append(line.strip("\n"))
print values

for val in values:       
    if (val == match):
        del values[0:3]
        print("deleted\n\n\n\n\n\n")
        processdata(values)

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

Вы всегда удаляете первые три значения в списке вместо тех, которые соответствуют вашему шаблону. Попробуйте изменить ваш for-l oop следующим образом:

    found_match = 0
    for idx, val in enumerate(values):
        if (int(val) == match):
            found_match += 1
            if (found_match == 3):
                del values[idx-2:idx+1]
                print("deleted\n\n\n\n\n\n")
                processdata(values)
        else:
            found_match = 0
0 голосов
/ 03 мая 2020

Определите функцию генератора, которая дает результатов по запросу эффективно:

def read_data():
    with open("<your file>") as f:
        counter, sublist = 0, []
        for line in f:
            if line.strip() == "0000":
                counter += 1
                if sublist and counter == 3:
                    yield sublist
                    sublist = []
                continue

            counter = 0
            sublist.append(int(line.strip()))
        else:
            yield sublist

Использование функции read_data():

for data in read_data():
    # TODO: process the data 
    # processdata(data)
    print(data)

Это печатает:

[1111, 2222, 3333, 3333, 4444, 5555, 6666, 7777, 8888]
[1111, 2222, 3333, 3333, 4444, 5555, 6666, 7777, 8888]
0 голосов
/ 03 мая 2020

Попробуйте:

with open('test.txt') as fp:
    data = [line.strip() for line in fp]
    data = ' '.join([' '.join(data[i: i + 3]) for i in range(0, len(data), 3)])
    data = [list(map(int, x.split())) for x in data.split('0000 0000 0000') if x]
    print(data)

Вывод:

[[1111, 2222, 3333, 3333, 4444, 5555, 6666, 7777, 8888], [1111, 2222, 3333, 3333, 4444, 5555, 6666, 7777, 8888]]
...