我有一个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
答案 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