Как мне разобрать несколько файлов в Python и извлечь важную информацию? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь написать программу, которая периодически считывает данные из сотен файлов YAML и сохраняет определенную информацию, содержащуюся в файлах, в какой-то таблице.Программа будет по существу анализировать каждый файл YAML в данном каталоге и извлекать соответствующую информацию, пока каждый файл не будет успешно проанализирован.

Пример содержимого одного из файлов YAML:

%YAML:1.0
camera_rotation_wrt_base: !!opencv-matrix
  cols: 3
  data: [-0.0159428846, 0.0246045925, 0.999570131, -0.999774337, -0.0144301597, -0.0155909406,
    0.0140403481, -0.999593139, 0.024829099]
  dt: f
  rows: 3
camera_translation_wrt_base: [0.4445618987083435, 0.11700689047574997, 1.5018157958984375]
object_rotation_wrt_base: !!opencv-matrix
  cols: 3
  data: [-0.74130547, -0.0615471229, 0.668339849, 0.669196069, -0.144052029, 0.728989482,
    0.0514085107, 0.987654269, 0.147973642]
  dt: f
  rows: 3
object_rotation_wrt_camera: !!opencv-matrix
  cols: 3
  data: [-0.6565323818253673, 0.1588616842697038, -0.737379262582055, -0.07928983462501557,
    -0.9866892288165471, -0.14197683014545748, -0.7501189077886223, -0.03474571781315458,
    0.6603895951165363]
  dt: f
  rows: 3
object_translation_wrt_base: [1.1534364223480225, 0.05951927974820137, 1.3502429723739624]
object_translation_wrt_camera: [0.04407151401699165, 0.16979082390232392, 0.705698973194305]
template_id: 1965

Я хотел бы иметь возможность сохранить ключ данных из ключа object_rotation_wrt_camera, а также ключ object_translation_wrt_camera,в CSV-файле, например, так:

observation,rotation,translation
1,[-0.53434, 0.023343, .....],[0.54545,0.34344,....]                
2,[-0.52234, 0.3433, .....],[0.65645,0.8787344,....] 
3,[0.32234, 0.6453, .....],[0.622645,0.1787344,....]

В приведенной выше таблице номер наблюдения относится к файлу yaml, и поэтому для каждого файла в CSV-файле хранится наблюдение как для поворота, так и для поворота.переменная перевода.(примечание: периоды, используемые в таблице, просто указывают, что переменные поворота и перемещения продолжаются, так как они довольно длинные).

Наконец, я хотел бы создать окончательный файл CSV, который аналогичен приведенному выше, однако вместо этого все значения вращения и перевода разделены (это означает, что вместо одного столбца для перевода и одного для вращения,есть 3 для перевода, относящихся к 3 значениям в списках предыдущего файла CSV, и 9 столбцов, относящихся к каждому из 9 значений в списках предыдущего файла CSV), например:

observation,tran1,tran2,tran3,rot1,rot2,rot3,rot4,rot5,rot6,rot7,rot8,rot9
1,-0.545434,4.54545,0.343434,.............................................
2,-0.4543,3.3434,0.3534,..................................................

1 Ответ

0 голосов
/ 22 марта 2019

Я сохранил ваш пример в двух разных файлах с .yaml окончаниями и затем запустил:

import sys
from pathlib import Path
import csv
import ruamel.yaml

result = [['observation', 'rotation', 'translation']]
flatres = ["observation,tran1,tran2,tran3,rot1,rot2,rot3,rot4,rot5,rot6,rot7,rot8,rot9".split(',')]
yaml = ruamel.yaml.YAML()

for idx, file_name in enumerate(Path('.').glob('*.yaml')):
   txt = file_name.read_text()
   if txt.startswith('%YAML:1.0'):
      txt = txt.replace('%YAML:1.0', "", 1).lstrip()
   data = yaml.load(txt)
   result.append([
     idx+1,
     data['object_rotation_wrt_camera']['data'],
     data['object_translation_wrt_camera'],
   ])
   row = [idx+1]
   row.extend(data['object_translation_wrt_camera'])
   row.extend(data['object_rotation_wrt_camera']['data'])
   flatres.append(row)

writer = csv.writer(sys.stdout)
writer.writerows(result)
print('---------')
writer = csv.writer(sys.stdout)
writer.writerows(flatres)

, что дает:

observation,rotation,translation
1,"[-0.6565323818253673, 0.1588616842697038, -0.737379262582055, -0.07928983462501557, -0.9866892288165471, -0.14197683014545748, -0.7501189077886223, -0.03474571781315458, 0.6603895951165363]","[0.04407151401699165, 0.16979082390232392, 0.705698973194305]"
2,"[-0.6565323818253673, 0.1588616842697038, -0.737379262582055, -0.07928983462501557, -0.9866892288165471, -0.14197683014545748, -0.7501189077886223, -0.03474571781315458, 0.6603895951165363]","[0.04407151401699165, 0.16979082390232392, 0.705698973194305]"
---------
observation,tran1,tran2,tran3,rot1,rot2,rot3,rot4,rot5,rot6,rot7,rot8,rot9
1,0.04407151401699165,0.16979082390232392,0.705698973194305,-0.6565323818253673,0.1588616842697038,-0.737379262582055,-0.07928983462501557,-0.9866892288165471,-0.14197683014545748,-0.7501189077886223,-0.03474571781315458,0.6603895951165363
2,0.04407151401699165,0.16979082390232392,0.705698973194305,-0.6565323818253673,0.1588616842697038,-0.737379262582055,-0.07928983462501557,-0.9866892288165471,-0.14197683014545748,-0.7501189077886223,-0.03474571781315458,0.6603895951165363

Потому что в последовательностях есть запятые, которые вы хотите иметь хранятся, эти записи должны быть в кавычках, и писатель CSV Python делает это автоматически (в противном случае второй и следующие строки CSV будет иметь гораздо больше, чем три элемента).

YAML 1.0 был заменен на YAML 1.1 в 2005 году, и я не заплатил особое внимание на различия между этими версиями, кроме директива. YAML 1.2 является стандартом YAML с 2009 года. ruamel.yaml поддерживает только файлы с явным YAML 1.2 (или 1.1) директивы, поэтому директива %YAML:1.0 должна быть явно удалены из этих файлов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...