2016-03-08 2 views
2

У меня есть текстовый файл, представляющий данные вектора движения из видеоклипа.извлечение данных из текстового файла в Python

# pts=-26 frame_index=2 pict_type=P output_type=raw shape=3067x4 
8 8 0 0 
24 8 0 -1 
40 8 0 0 
... 
8 24 0 0 
24 24 3 1 
40 24 0 0 
... 
8 40 0 0 
24 40 0 0 
40 40 0 0 
# pts=-26 frame_index=3 pict_type=P output_type=raw shape=3067x4 
8 8 0 1 
24 8 0 0 
40 8 0 0 
... 
8 24 0 0 
24 24 5 -3 
40 24 0 0 
... 
8 40 0 0 
24 40 0 0 
40 40 0 0 
... 

Так что это своего рода сетку, где первые две цифры являются х и у координаты и третий и четвертый являются х и у значения векторов движения.

Чтобы использовать дальнейшие эти данные, мне нужно извлечь пары значений x и y, где хотя бы одно значение отличается от 0 и организует их в списках.

Например:

(0, -1, 2) 
(3, 1, 2) 
(0, 1, 3) 
(5, 3, 3) 

Третья цифра является frame_index.

Я был бы очень признателен, если бы кто-нибудь помог мне с планом, как взломать эту задачу. От чего я должен начать.

+0

Я принимаю пример '(5, 3, 3)' должен быть '(5, -3, 3)'? –

+0

Да. Файл огромен, поэтому я написал небольшой пример, чтобы объяснить, что находится в файле. –

ответ

1

Это на самом деле довольно просто, поскольку существует только один тип данных. Мы можем сделать это, не прибегая к, например, обычные выражения.

Игнорирование любой проверки ошибок (ли мы на самом деле читать 3067 точек на раме 2, или только 3065? Является ли строка неправильный формат? ...), это будет выглядеть примерно так

frame_data = {} # maps frame_idx -> list of (x, y, vx, vy) 
for line in open('mydatafile.txt', 'r'): 
    if line.startswith('#'): # a header line 
     options = {key: value for key, value in 
         [token.split('=') for token in line[1:].split()] 
        } 
     curr_frame = int(options['frame_index']) 
     curr_data = [] 
     frame_data[curr_frame] = curr_data 
    else: # Not a header line 
     x, y, vx, vy = map(int, line.split()) 
     frame_data.append((x, y, vx, vy)) 

Вы знаете, есть словарь который отображает номер кадра в список элементов (x, y, vx, vy) кортежей.

Извлекая новый список из словаря теперь легко:

result = [] 
for frame_number, data in frame_data.items(): 
    for x, y, vx, vy in data: 
     if not (vx == 0 and vy == 0): 
      result.append((vx, vy, frame_number)) 
+0

Спасибо большое! Я получил объект AttributeError: 'dict' не имеет атрибута 'append'. Так изменилось 'frame_data.append ((х, у, Vx, Vy))' к 'frame_data [curr_frame] .append ((х, у, Vx, Vy))' –

 Смежные вопросы

  • Нет связанных вопросов^_^