python достигает и заменяет несколько строк и арифметику

Я пытаюсь преобразовать файл postscript таким образом, чтобы отдельные смежные полигоны (нарисованные в режиме fillcurve gnuplot) преобразовывались в один полигон. См. также этот связанный вопрос:

артефакты gnuplot

К тому же, я столкнулся со следующей проблемой.

полигоны имеют такую ​​структуру в ps-файле

some statements
A1 A2 A3 A4 A5
B1 B2 B3 B4 B5
some statements

A1,A2.. и т.д. числа. Обработанный файл должен выглядеть так (здесь произвольный пример)

some statements
A1    A2
B1    B2
B1+A2 B5-A4
B1+A2 B5-A5
B1    B2
A1    A2
some statements

Вот, напр. B1+A2 должно быть результатом арифметической операции, то есть числом с плавающей запятой. Как можно что-то подобное в питоне? Каким-то образом мне нужно отсканировать файл, вычислить определенные строки и сохранить их (т.е. отдельные поля, как в awk)?

РЕДАКТИРОВАТЬ:

раздел из исходного файла постскриптума выглядит так

5918 4703 N
399 0 V
0 70 V
-399 0 V
0 -70 V
Z stroke
LT0
630 399 N 0 -3498 586 131 0 3490 h
1216 522 N 0 -3525 1171 204 0 3498 h
2387 699 N 0 -3557 1171 134 0 3525 h
3558 801 N 0 -3587 1171 55 0 3557 h
4729 826 N 0 -3613 1171 -20 0 3587 h
5900 780 N 0 -3624 585 -43 0 3613 h
% End plot #1
1.000 UL
LTb
0.500 UL
LTa
0.13 0.13 0.13 C 630 280 M
5855 0 V
stroke

где N и h обозначают

/N {newpath moveto} bind def
/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def

в этом файле у нас есть 6 полигонов, они определены между строкой "LT0" и "% end plot #1". Строки, в которых определены многоугольники, легко сопоставить с регулярным выражением.

/^[0-9,-]+\ [0-9,-]+\ N\ [0-9]\ [0-9,-]+\ [0-9,-]+\ [0-9,-]+\ [0-9,-]+\ [0-9,-]+ h/

Я хотел бы преобразовать их во что-то вроде

newpath
 630 399 moveto
1216 522 lineto
2387 699 lineto
3558 801 lineto
4729 826 lineto
5900 780 lineto
..   ..   ..
..   ..   ..

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


person Raphael Roth    schedule 21.06.2012    source источник
comment
не могли бы вы объяснить структуры данных, пожалуйста? A3/B3 не являются полезными значениями в формате ps???   -  person Aprillion    schedule 21.06.2012


Ответы (2)


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

with open('data.txt') as inf, open('out.txt', 'w') as outf:
   for line in inf:
      if # line with numbers
         # then code similar to what's shown below
         # generating a new value for variable line
         line = .... # see below

      outf.write(line+'\n') # write out "line" to output file, either the
                            # original non-number line, or the "modified"
                            # line with the parsed/math results.

Подробная информация о том, как собирать данные из вашего файла, требует дополнительной информации о формате данных/файла, но в целом для строки, содержащей числа, вы можете проанализировать ее, используя split(), а затем преобразовать части в значения с плавающей запятой, используя понимание списка следующим образом:

line = '5.5 6.09 8.0 12.2'
n = [float(i) for i in line.split()]

теперь n — это список float значений.

n
[5.5, 6.09, 8.0, 12.2]

с помощью которого вы можете делать математику и распечатывать (хотя здесь результаты присваиваются как строка переменной):

line = "%.2f %.2f" %((n[0]+n[1]), (n[2]+n[3]))
11.59 20.20

Кроме того: преимущество использования with для открытия файлов заключается в том, что они закрываются, когда вы закончите или возникнет исключение.

person Levon    schedule 21.06.2012

Нам нужно немного больше информации, чтобы помочь вам:

  • Укажите фактический раздел файла, в котором определены полигоны, а не псевдокод.

  • Есть ли очевидный способ распознать, что является желаемыми полиданными, а что нет? Как узнать, какой фрагмент файла мы ищем? Учитывая это, должно быть довольно легко открыть файл (как показано Левоном) и получить данные.

  • Как только мы получим полигональные данные, поиск объединения двух полигонов будет немного сложным, если только они не имеют последовательных совпадающих вершин - см. Как мне объединить сложные многоугольники? . Возможно, было бы проще делегировать это библиотеке геометрии, такой как Shapely.

person Hugh Bothwell    schedule 21.06.2012