python访问并替换多行和算术

2024-09-29 00:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

gnuplot artifacts

为此,我面临以下问题。在

多边形在ps文件中具有这样的结构

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

A1,A2。。等等是数字。处理后的文件应该如下所示(这里是任意示例)

^{pr2}$

这里,例如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
..   ..   ..
..   ..   ..

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


Tags: 文件a2stroke定义plota1some多边形
2条回答

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

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

  • 有没有一种明显的方法可以识别出所需的多边形数据是什么,不是什么?我们如何判断我们在寻找哪个文件块?鉴于此,打开文件(如Levon所示)并获取数据应该非常容易。

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

我们需要更多关于文件格式的信息,比如如何用数字标识行,这些行上有多少个数字等等,但实际上你打开文件并逐行处理它。在

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将各部分转换为浮点值,如下所示:

^{pr2}$

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

相关问题 更多 >