使用Python中的关键字将文件拆分为文件?

时间:2011-08-05 16:29:51

标签: python python-3.x

我正在尝试弄清楚如何使用关键字作为拆分指标来获取文件并分成子文件。就我而言,我有一个大文件,如下所示:

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

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

File_1:
Racecar
line2...
line3...

File_2:
Racecar
line5...
line6...
line7...
line8...

File_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()函数,但显然这对字符串不起作用。我使用的文件足够小,可以读入内存。谁能帮我这个?提前谢谢。

3 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:0)

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]);

可能有更有效的方法,特别是避免两个循环。但是,如果它与您声称的一样小,则无关紧要。

答案 2 :(得分:0)

好像你已经找到了让下一次出现Racecar的方法。您的for循环最终将覆盖所有这些循环。问题是当你到达他们时该怎么做。我不明白你对headerheader_num等的看法。

似乎要做的就是像你一样迭代bigfile中的行(尽管没有多余的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的某些变体可能更好 - 但这似乎与您原来的方法最接近。