我有这段文字,我会分享一部分,


  罗密欧
  
  但是,柔软!窗外有什么光线打破?
  它是东方,朱丽叶是太阳。
  
  朱丽叶
  
  me!
  
  罗密欧
  
  她说:
  哦,再说一次,聪明的天使!因为你
  
  朱丽叶
  
  罗密欧,罗密欧!为何你偏偏是罗密欧?
  否认你的父亲,拒绝你的名字;
  
  罗密欧
  
  请问我能听到更多吗?


我想编写一个循环,在行中查找名称并将其后的内容保存到特定文件中,在这种情况下,如果“ ROMEO”是找到的单词,则将其保存到“ Romeo.txt”中的每一行,直到找到单词“ JULIET”,然后将所有内容保存到“ Juliet.txt”。我尝试通过合并循环和if语句自己对它进行编码,但这使我无所适从。
句柄=打开(“ romeo-full.txt”)
船长=“ ROMEO”

handle = open("romeo-full.txt")
skipper = "ROMEO"

for line in handle:
    line = line.strip()
    while skipper == "ROMEO":
        print(line) #This would be the write to file code
        if line.startswith("ROMEO"):
            skipper = "JULIET"
            break
        else:
            continue

    while skipper == "JULIET":
        print(line) #This would be the write to file code
        if line.startswith("ROMEO"):
            skipper = "ROMEO"
            break
        else:
            continue


输出基本上是“ ROMEO”行循环,我知道它永远来自循环通过第一行的while循环,但是我找不到比这更接近我想要的方法。

最佳答案

避免重复代码的一种方法是将主文件中的标头用作要写入的文件的“选择器”。就像是:

with open("romeo-full.txt") as handle, \
     open("romeo.txt", 'w') as r_f, \
     open("juliet.txt", 'w') as j_f:

    file_chooser = {"ROMEO": r_f,
                    "JULIET": j_f}

    for line in handle:
        try:
            cur_file = file_chooser[line.strip()]
        except KeyError:
            cur_file.write(line)


try/except块的目的是仅在遇到标题之一(然后跳过它)时才更改cur_file



避免这种情况的一种方法是将dict的get方法与默认值cur_file一起使用(因此它仅在标头上更改):

with open("romeo-full.txt") as handle, \
     open("romeo.txt", 'w') as r_f, \
     open("juliet.txt", 'w') as j_f:

    file_chooser = {"ROMEO": r_f,
                    "JULIET": j_f}
    cur_file = r_f
    for line in handle:
        cur_file = file_chooser.get(line.strip(), cur_file)

        cur_file.write(line)


不利之处在于,标头也将每次都写入文件中。

10-07 18:30