有选择地从vrml(wrl)文件中删除代码

时间:2012-08-09 16:19:17

标签: python

我有一个vrml(wrl)文件,我需要删除文本的chucks。要删除的文本块可以通过match1和match2来识别。

要删除的文本块应该来自match1,但不包括match2。注意match1也应该从删除中排除。

所以给出以下内容,其中match1为“color [”,match2为“] #color”:

...
a
b
color [
0 0 0
0 0 0
0 0 0
] #color
c
d
...

使用Levon提供的以下代码:

with open('try1a.wrl') as inf:
    ignoreLines = False
    for line in inf:
        if 'color [' in line:
            print line,
            ignoreLines = True
        if '] #color' in line:
            ignoreLines = False            
        if not ignoreLines:
            print line,

我得到以下内容:

a
b
color [
] #color
c
d

这是我想要的。

但是,我发现存在另外一组这些文本块 并分别以match1和match2结尾,不应删除。我想要删除的块与我不想删除的块之间的区别是match1之后的行。

因此,如果代码看到以下内容,它应该在不删除任何内容的情况下通过此chuck,然后转到下一个:

...
a
b
color [
0 0 1     # since this is not "0 0 0" the code should leave this unchanged
0 0 0
0 0 0
] #color
c
d
...

总而言之,如果代码在match1之后看到“0 0 0”,则删除所有行匹配到2(代码当前没有问题),但如果代码没有看到“0 0 0”则离开此单独进入下一个。后一种功能需要添加到Levon提供的代码中。顺便说一句,感谢Levon提供此代码!

编辑:

这是成品,它的效果非常好,再次感谢所有帮助过我的人:

import string
import sys
import re
import subprocess

file_name_in = sys.argv[1]
file_name_out = sys.argv[2]

f = file(file_name_out, 'w')
sys.stdout = f

with open(file_name_in) as inf:
    ignoreLines = False
    for line in inf:
        if 'color [' in line:
            print line,
            line = next(inf, '')
            ignoreLines = all((s == '0' or s == '0,') for s in line.split())
        if '] #color' in line:
            ignoreLines = False            
        if not ignoreLines:
            print line,

sys.stdout = sys.__stdout__
f.close()

# remlns8.py inputFile.wrl outputFile.wrl

1 个答案:

答案 0 :(得分:0)

ignoreLines = True替换为:

line = next(inf, '') # a file is an iterator over lines
ignoreLines = all((s == '0') for s in line.split()) # ignore if all zeros