0

テキストのチャンクを削除する必要がある vrml (wrl) ファイルがあります。削除するテキストのチャンクは、match1 と match2 で識別できます。

削除するテキストのチャンクは、match1 から match2 まで (ただし 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 で始まり、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 に答える