1

テキスト ファイルをクリーンアップするプログラムを作成しようとしています。具体的には、シェイクスピアの「真夏の夜の夢」のコピーをクリーンアップしようとしています。スクリプトからステージの指示を削除するコードを作成しようとしています。そのため、このテキストは次のようになります。

テセウス 行って、猟師に角で目を覚ますように命じてください。

[角、そして内なる叫び。目覚めたデメトリウス、ライサンダー、ハーミア、ヘレナ

起動します。 ]

おはよう、友達。聖バレンタインは過ぎ去りました。これらの木の鳥を始めますが、今カップルにするのですか?

LYSANDER 申し訳ございません、ご主人様。

[彼と残りはテセウスにひざまずく。]

テセウス

皆様、立ち上がってください。お二人がライバルであることは承知しています。憎しみは嫉妬とはかけ離れていて 憎しみによって眠り、敵意を恐れないというこの穏やかな調和が、どうして世界に生まれるのでしょうか?

次のテキストになります。

テセウス 行って、猟師に角で目を覚ますように命じてください。

おはよう、友達。聖バレンタインは過ぎ去りました。これらの木の鳥を始めますが、今カップルにするのですか?

LYSANDER 申し訳ございません、ご主人様。

テセウス

皆様、立ち上がってください。お二人がライバルであることは承知しています。憎しみは嫉妬とはかけ離れていて 憎しみによって眠り、敵意を恐れないというこの穏やかな調和が、どうして世界に生まれるのでしょうか?

これは私が書いたコードですが、私が想定している while ループでハングアップしています。どんな助けでも大歓迎です!

def cleanDirections(inFilename, outFilename):
    inFile = open(inFilename, "r")
    outFile = open(outFilename, "w")

    line = inFile.readline()

    while line != "":

        if line.startswith("[") == True:
            if line.endswith("]") == True:
                line = inFile.readline()
            else:
                while line.endswith("]") == False:
                    line = inFile.readline()
            line = inFile.readline()

        else:
            outFile.write(line)
            line = inFile.readline()

また、この種の構文でヘルプを提供できれば、それは素晴らしいことです。私はまだ学習中なので、より高度な Python についてはまだ知りません。

4

4 に答える 4

2

括弧は複数の行にまたがるため、これを行ごとに行うことはできません。使用する:

text = inFile.readLines()
text = re.sub("\[[^\]]*\]","",text) #will kill any [STUFF]
于 2013-11-06T02:03:50.677 に答える
1

これは、次のような多くの仮定を行う非常に単純なアプローチです。

  1. 最初の列の「[」のみが重要です。
  2. "[" と "]" はネストしません。角かっこは 1 レベルしかありません。
  3. "]" に続く行には何もありません (おそらく空白を除く)。"]" に続くものはすべて失われます。

それらと一緒に暮らすことができる場合:

inFile = open(inFilename, "r")
outFile = open(outFilename, "w")
skipping = False
for line in infile:
    if skipping:
        # don't print this line no matter what,
        # hut stop skipping if "]" in line
        if "]" in line:
            skipping = False
    elif line.startswith("["):
        # don't print this line either no matter what,
        # and start skipping if "]" _not_ in the line
        skipping = "]" not in line
    else:
        outfile.write(line)
infile.close()
outfile.close()
if skipping:
    raise ValueError("hit end of file with unclosed '['!")

これらの制限に耐えられない場合は、さらに複雑になります;-)

于 2013-11-06T02:39:58.467 に答える
0

私はこれをCのような方法で行いましたが、Pythonは初めてです。理解するのは簡単です:)

newFile = open('out.txt', 'w')

inStageDirections = False

with open('sp.txt') as f:
    for c in f.read():
        if inStageDirections is False and c == '[':
            inStageDirections = True
        elif inStageDirections is True and c == ']':
            inStageDirections = False
            continue

        if not inStageDirections:
            newFile.write(c)

        if inStageDirections:
            pass

ファイル char を char ごとに解析し、inStageDirectionsカウンター[を設定して、次のテキストが新しいファイルに書き込まれないようにします。ただし、正規表現を使用してこの作業を完了することを強くお勧めします。これは、より高速でエレガントであるためです。

于 2013-11-06T02:50:57.093 に答える