python到达并替换多行和算术

时间:2012-06-21 14:52:05

标签: python regex gnuplot postscript

我尝试转换postscript文件,以便将单个相邻多边形(由gnuplot的fillcurve模式绘制)转换为单个多边形。另见相关问题:

gnuplot artifacts

为此,我面临以下问题。

多边形在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应该是算术运算的结果,即浮点数。怎么能在python中这样的东西呢?不知怎的,我需要扫描文件,数学某些行并保存它们(即awk中的各个字段)?

编辑:

原始postscript文件中的一个部分如下所示

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
..   ..   ..
..   ..   ..

因为我想逐点定义绝对坐标,所以新的多边形有更多的代码行。替换单行不起作用。

2 个答案:

答案 0 :(得分:1)

我们需要更多关于文件格式的信息,例如如何识别带有数字的行,这些行上有多少个数字等,但实质上是你打开文件并逐行处理。

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()对其进行解析,然后将这些部分转换为浮点值像这样使用list comprehension

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

现在nfloat值的列表。

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打开文件的好处是,当您完成或遇到异常时它们会被关闭。

答案 1 :(得分:0)

我们需要更多信息来帮助您:

  • 请提供定义多边形的文件的实际部分,而不是伪代码。

  • 是否有明显的方法来识别什么是所需的多边形数据?我们怎样才能分辨出我们要查找的文件块?鉴于此,打开文件(如Levon所示)并抓取数据应该非常容易。

  • 一旦我们得到多边形数据,找到两个多边形的并集是有点涉及的,除非它们有连续的重合顶点 - 见How do I combine complex polygons?。将其委托给像Shapely这样的几何库可能更容易。