【问题标题】:Split file into files with keyword in Python?在Python中将文件拆分为带有关键字的文件?
【发布时间】:2011-08-05 16:29:50
【问题描述】:

我试图弄清楚如何使用关键字作为拆分指示符来获取文件并分成子文件。就我而言,我有一个看起来像这样的大文件:

Racecar
line2...
line3...
Racecar
line5...
line6...
line7...
line8...
Racecar
line10...

在每次出现Racecar 一词时,我想拆分文件并创建一个子文件。使用上面的示例,File_1 将有 3 行,File_2 将有 5 行,File_3 将有 2 行。这些文件看起来像这样:

文件_1:
Racecar
line2...
line3...

文件_2:
Racecar
line5...
line6...
line7...
line8...

文件_3:
Racecar
line10...

我意识到像 sed 或 awk 这样的东西会更适合这个,但我需要在 Python 中执行此操作。出于某种原因,我真的坚持这一点。我试着写这样的东西:

with open("bigfile", mode="r") as bigfile:
    reader = bigfile.readlines()
    for i,line in enumerate(reader):
        if line.startswith("Racecar"):
            header = line
            header_num = i

我似乎被卡住了,因为我找不到下一次出现 Racecar 的方法。我一直想使用next() 函数,但显然这不适用于字符串。我使用的文件足够小,可以读入内存。谁能帮我这个?提前致谢。

【问题讨论】:

标签: python python-3.x


【解决方案1】:
with open("bigfile", mode="r") as bigfile:
    reader = bigfile.read()
    for i,part in enumerate(reader.split("Racecar")):
        with open("File_" + i+1, mode="w") as newfile:
            newfile.write("Racecar"+part)

【讨论】:

  • readlines 返回一个列表,而您正在对它调用 split ,但它不存在。
  • @Vader,阅读行列表然后加入似乎很浪费。 bigfile.read() 怎么样?
  • +1 然后 :)。 (顺便说一句,谁反对这个应该解释为什么。)
  • 谢谢大家!上面的代码效果很好。我遇到的唯一问题是我得到了一个仅包含 Racecar 的额外文件。
  • @dr.bunsen 这是因为 'Racecar' 是源文件中的第一个单词,因此 reader.split("Racecar") 的第一部分是一个空字符串。我认为上面代码中的reader.split("Racecar")[1:] 而不是reader.split("Racecar") 应该可以解决您的问题。
【解决方案2】:
out_array = []
with open("bigfile", mode="r") as bigfile:
    for line in bigfile:
        if line.startswith("Racecar"):
            out_array.append(line)
        else:
            out_array[-1] += line

for i in range(len(out_array)):
    out_filename = "File%d.txt" % i
    with open(out_filename, mode="w") as out_file:
         out_file.write(out_array[i]);

可能有更有效的方法,尤其是避免两个循环。但是,如果它像您声称的那么小,则无关紧要。

【讨论】:

    【解决方案3】:

    您似乎找到了获得下一个 Racecar 的方法。您的 for 循环最终将到达所有这些。问题是当你到达他们时该怎么做。我不明白你对headerheader_num 等的用途。

    似乎要做的事情是像您一样遍历大文件中的行(尽管没有多余的readlines),并且每次点击Racecar 行时,打开一个新的输出文件。

    如:

    with open("bigfile", mode="r") as bigfile:
        smallfile_prefix = "File_"
        file_count = 0
        smallfile = open(smallfile_prefix + str(file_count), 'w')
        for line in bigfile:
            if line.startswith("Racecar"):
                smallfile.close()
                file_count += 1
                smallfile = open(smallfile_prefix + str(file_count), 'w')
            else:
                smallfile.write(line)
        smallfile.close()
    

    还有其他方法可以做到这一点——例如,Vader's answer 的一些变化可能会更好——但这似乎最接近你原来的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多