0

我有一个 vrml (wrl) 文件,我需要从中删除一些文本。要删除的文本块可以由 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 后面的行。

因此,如果代码看到以下内容,它应该越过这个卡盘而不删除任何东西,然后继续下一个:

...
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”,则删除 match2 之前的所有行(代码当前可以正常工作),但如果代码没有看到“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
4

1 回答 1

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
于 2012-08-09T16:30:44.077 回答