Python 将文件中特定字符串后的所有行保存到单独的文件中

Python 将文件中特定字符串后的所有行保存到单独的文件中,python,Python,我有一个文件,其中包含未知行数的介绍性文本块,然后文件的其余部分包含数据。在数据块开始之前,有列标题,我想跳过这些标题。因此,该文件如下所示: with open("data.txt", "r") as infile: x = infile.readlines() x = [i.strip() for i in x[x.index('UniqueString\n') + 1:] if i != '\n' ] with open("output.txt", "w") as outfil

我有一个文件,其中包含未知行数的介绍性文本块,然后文件的其余部分包含数据。在数据块开始之前,有列标题,我想跳过这些标题。因此,该文件如下所示:

with open("data.txt", "r") as infile:
    x = infile.readlines()

x = [i.strip() for i in x[x.index('UniqueString\n') + 1:] if i != '\n' ]

with open("output.txt", "w") as outfile:
    for i in x[1:]:
        outfile.write(i+"\n")
这是一个介绍。。
废话废话。。。
...
唯一字符串
时间位置计数
0 35 12
1 48 6
2 96 8
...
1000 82 37

我想将时间位置和计数数据记录到一个单独的文件中。时间位置和计数数据仅出现在
唯一字符串之后

这是您要查找的吗

reduce(lambda x, line: (x and (outfile.write(line) or x)) or line=='UniqueString\n', infile)
工作原理:

  • 文件可以迭代,因此我们可以通过简单地执行
    […for line in infle]
  • 在操作部分,我们使用了这样一个事实,即如果and的第一个操作数是
    False
    ,则不会触发
    writeline()
  • 部分中,如果找到所需的行,我们将设置触发器,因此将为下一行和后续行触发
    writeline
  • reduce的默认初始值为None,其计算结果为
    False

您可以提取数据并将其写入另一个文件,如下所示:

with open("data.txt", "r") as infile:
    x = infile.readlines()

x = [i.strip() for i in x[x.index('UniqueString\n') + 1:] if i != '\n' ]

with open("output.txt", "w") as outfile:
    for i in x[1:]:
        outfile.write(i+"\n")
我认为这很简单:文件被打开,所有行都被读取,列表从标题字符串开始,所需的剩余行被再次写入文件。

您可以创建一个(和更多信息)来为您过滤文件
它以增量方式运行,因此不需要一次将整个文件读入内存

def extract_lines_following(file, marker=None):
    """Generator yielding all lines in file following the line following the marker.
    """
    marker_seen = False
    while True:
        line = file.next()
        if marker_seen:
            yield line
        elif line.strip() == marker:
            marker_seen = True
            file.next()  # skip following line, too

# sample usage
with open('test_data.txt', 'r') as infile, open('cleaned_data.txt', 'w') as outfile:
    outfile.writelines(extract_lines_following(infile, 'UniqueString'))

如果您使用的是Python 3,则可以对其进行一些优化,但基本思想是相同的。

我建议使用CSV阅读器(因为您的文件在标题行之后被格式化为表格),并使用
while
循环跳过行,直到找到标题。另外,请考虑数据可以容易地具有1E8到1E9行。<代码> RealLink()/<代码>和随后的<代码>“n”。也就是说,如果infle足够大,它会导致问题。我们说的有多大?数据很容易包含1亿到10亿行。另外,我正在处理的实际数据文件有12列支持它。这是否达到了您想要的效果?我已经尝试过(直接复制它,只是更改了变量名),但它只记录了介绍性文本块中的第二行。缺少一个条件(
(outfile.write(line)或x)
)。请再试一次