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

时间:2017-02-06 18:30:53

标签: 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之后出现。

3 个答案:

答案 0 :(得分:0)

这是你在找什么?

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

工作原理:

  • 文件可以迭代,因此我们可以通过简单地infile
  • 逐行阅读[... for line in infile]
  • 在操作部分中,我们使用的事实是,如果第一个操作数为和writeline(),则不会触发False
  • or部分,我们设置了触发器,如果​​找到了所需的行,那么将为下一行和后续行触发writeline
  • reduce的默认初始值为None,其值为False

答案 1 :(得分:0)

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

select carrier, 
       PolicyNumber,
       sum(AnnualPremium) CurrentYearAnnualPremium
from #totalinforcepremium
group by carrier, 
         PolicyNumber
order by PolicyNumber

select carrier, 
       PolicyNumber,
       sum(AnnualPremium) PreviousYearAnnualPremium
from #TotalInforcePremiumPreviousYear
group by carrier, 
         PolicyNumber
order by PolicyNumber

我认为这是非常简单的:文件被打开并且所有行都被读取,列表解析以列表字符串开头切割列表,并且所需的剩余行再次写入文件。

答案 2 :(得分:0)

您可以创建一个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'))

如果您使用的是Python 3,可以稍微优化一下,但基本思路是一样的。