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

2024-05-14 23:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件包含一个未知行数的介绍性文本块,然后文件的其余部分包含数据。在数据块开始之前,有一些列标题,我想跳过它们。所以文件看起来像这样:

this is an introduction..
blah blah blah...
...
UniqueString
Time Position Count
0 35 12
1 48 6
2 96 8
...
1000 82 37

我想记录时间位置和计数数据到一个单独的文件。时间位置和计数数据只出现在UniqueString之后。你知道吗


Tags: 文件数据文本an标题timeiscount
3条回答

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

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")

我认为这很简单:文件被打开,所有的行都被读取,一个列表从头字符串开始,剩下的行被再次写入文件。你知道吗

这是你要找的吗?你知道吗

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

工作原理:

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

您可以创建一个generator function(以及更多信息here),为您过滤文件。
它以增量方式运行,因此不需要一次将整个文件读入内存。你知道吗

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'))

如果您使用的是python3,则可以对其进行一些优化,但基本思想是相同的。你知道吗

相关问题 更多 >

    热门问题