【问题标题】:Match characters in a line and print the line before python匹配一行中的字符并在python之前打印该行
【发布时间】:2016-03-23 10:45:39
【问题描述】:

我有一个日志文件,这个文件是这样的:

line1 输入

line2 输出

line3 输入

line4 输出

等等……

根据输出我想将输入和输出都提取到一个新文件中..

作为示例代码,我使用了 print 和 .startswith 方法,这对我来说很好,因为我只对如何提取文件中的当前行和它之前的行感兴趣。

这是我的做法:

file = 'path_to_file'
index_list = []
line_list = []

with open(file) as f:
    for index, line in enumerate(f):
        line_list.append(line)
        if line.startswith('b'):
            index_list.append(index)

        
for index in index_list:
    print line_list[index-1], line_list[index]

这段代码工作得很好,但我想知道是否有更 Pythonic 的方式来做到这一点,节省内存。

提前谢谢你。

BR

【问题讨论】:

    标签: python file enumerate


    【解决方案1】:

    在内存中存储的行不超过两行:

    from itertools import izip
    
    with open('test.log') as lines:
        for input_line, output_line in izip(lines):
            if output_line.startswith('b'):
                print input_line
                print output_line
    

    将它放入一个函数并将print替换为yield,您可以将file.writelines()与该函数一起使用来编写匹配的输入/输出对。

    【讨论】:

      【解决方案2】:

      使用以下代码获取列表中文件的行。然后您可以轻松检索该行和上一行。另外我建议不要在 REPL 中运行它,因为大的日志文件可能会减慢 python REPL。

      with open(fileName) as file:
          content = file.readlines()
      

      希望这会有所帮助。

      【讨论】:

      • 一个大的日志文件不仅会减慢 REPL 的速度,还会减慢将整个文件读入内存的任何程序。如果进程开始交换,甚至整个系统的性能都会受到影响。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多