1

我正在尝试编写一个清理文本文件的程序;具体来说,我正在尝试清理莎士比亚的“仲夏夜之梦”的副本。我正在尝试编写一个代码,该代码将消除脚本中的舞台方向,以便此文本:

忒修斯 去,吩咐猎人用喇叭叫醒他们。

[喇叭,并在里面喊叫。德米特里厄斯、拉山德、赫米娅和海伦娜醒了

并启动。]

早安,朋友们。圣瓦伦丁过去了;开始这些木鸟,但现在要结对了吗?

拉山德 对不起,大人。

[他和其他人向忒修斯跪下。]

忒修斯

求大家,站起来。我知道你们两个是敌对的敌人;世间何来这温柔的默契, 恨与嫉妒相去甚远, 以恨入睡, 不怕敌意?

变成这个文本:

忒修斯 去,吩咐猎人用喇叭叫醒他们。

早安,朋友们。圣瓦伦丁过去了;开始这些木鸟,但现在要结对了吗?

拉山德 对不起,大人。

忒修斯

求大家,站起来。我知道你们两个是敌对的敌人;世间何来这温柔的默契, 恨与嫉妒相去甚远, 以恨入睡, 不怕敌意?

这是我编写的代码,但是在我假设的 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

我是 python 的新手,虽然我是用 C-Like 的方式做的。这很容易理解:)

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

它逐个字符地解析文件,并inStageDirections在您计数器时设置 a[以确保以下文本不会写入新文件中。虽然我强烈建议您使用正则表达式来完成这项工作,因为它更快、更优雅。

于 2013-11-06T02:50:57.093 回答
0

不使用re

while "[" in string:
    string=string.replace(string[string.find("["):string.find("]")+1],"")

您必须阅读所有文件才能string执行此操作。

于 2013-11-06T02:37:17.260 回答