如何在Python中按关键字拆分文件?

3 投票
3 回答
6081 浏览
提问于 2025-04-16 22:58

我想知道怎么把一个文件按照关键词分成几个小文件。在我的例子里,我有一个很大的文件,内容大概是这样的:

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

看起来你找到了获取下一个“Racecar”的方法。你的 for 循环最终会找到所有的“Racecar”。问题是,当你找到它们时该怎么做。我不太明白你提到的 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的回答 可能会更好,但这似乎最接近你最初的思路。

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

可能有更有效的方法,特别是可以避免使用两个循环。不过,如果数据量真的像你说的那么小,那其实也没什么大不了的。

5

这段代码是用来处理一些特定的任务的。它可能涉及到一些数据的操作,比如读取、修改或者存储数据。具体来说,代码块中的内容会告诉我们如何一步一步地完成这些操作。

在编程中,我们常常需要通过代码来指示计算机执行某些动作。这个代码块就是一个例子,它展示了如何用编程语言来实现这些功能。对于刚开始学习编程的人来说,理解这些代码的逻辑是非常重要的,因为它们是编程的基础。

如果你对这段代码有疑问,可以尝试逐行分析,看看每一行的作用是什么,慢慢就能掌握其中的技巧了。

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)

撰写回答