首页 > 解决方案 > 如何在正确的 if 语句之前打印第 X 行

问题描述

我对 Python 还是很陌生,对我通过众多网页找到的内容只有零碎的知识。

话虽如此,我正在尝试在文件(约 10k 行)中搜索我编写的一组类似“过滤器”的条件,然后我希望它打印符合条件的行和 X 数量的行它前面的线条。

我创建了以下脚本来打开所述文件,逐行迭代,并将满足过滤条件的行打印到输出文件,但是我很难将其合并到当前脚本中。

import os

output_file = 'Output.txt'
filename = 'BigFile.txt'                 

numLines = 0
numWords = 0
numChrs = 0
numMes = 0

f1 = open(output_file, 'w')
print 'Output File has been Opened'

with open(filename, 'r') as file:
   for line in file:
      wordsList = line.split()
      numLines += 1
      numWords += len(wordsList)
      numChrs += len(line)

      if "X" in line and "Y" not in line and "Z" in line:
          numMes += 1
          print >>f1, line
          print 'Object found and Catalogued in Output.txt'                          

print "Lines: %i\nWords: %i\nCharacters: %i" % (numLines, numWords, numChrs)
print >>f1, "Lines: %i\nWords: %i\nCharacters: %i" % (numLines, numWords, numChrs)

print "There are a total of %i thing in this file" % (numMes)
print >>f1, "There are a total of %i things in this file" % (numMes)

f1.close()

print 'Output Files have been Closed'

我的第一个猜测是使用line.enumeration,但我认为我不能只说lines - 5打印之前为 5 的行lines

lines = f1.enumeration()
if "blah blah" in line and "so so" not in line:
    print >>f1, lines
    print >>f1, [lines - 5]

最好的部分还没有到来,因为我必须获取 Output.txt 文件并与另一个文件进行比较以输出两个文件中的匹配标准......但一次一步,对吗?

- 也可以随意添加“正确”技术的简介......我相信这个脚本可以写成更好的方式,所以请教育我做任何我做错的事情。

提前感谢您的帮助!


更新:由于以下帮助,已成功实施修复:

import os

output_file = 'Output.txt'
filename = 'BigFile.txt'                 

numLines = 0
numWords = 0
numChrs = 0

numMulMes = 0

last5 = []

f1 = open(output_file, 'w')
print 'Output Files have been Opened'

with open(filename, 'r') as file:
    for line in file:
        wordsList = line.split()
        numLines += 1
        numWords += len(wordsList)
        numChrs += len(line)
        last5[:] = last5[-5:]+[line] 
        if "X" in line and "Y" not in line and "Z" not in line:
            del last5[1:5]           ###the missing piece of the puzzle!
            numMulMes += 1
            print >>f1, last5
            print 'Object found and Catalogued in Output.txt'

print "Lines: %i\nWords: %i\nCharacters: %i" % (numLines, numWords, numChrs)
print >>f1, "Lines: %i\nWords: %i\nCharacters: %i" % (numLines, numWords, numChrs)

print "There are a total of %i messages in this file" % (numMulMes)
print >>f1, "There are a total of %i messages in this file" % (numMulMes)

f1.close()
f3.close()

print 'Output Files have been Closed'

我一直试图通过另一个单独的脚本修改输出文件,并且在最长的时间内我一直在与 str 与 lst 操作和错误问题作斗争。只是决定回到原来的剧本,一时兴起把它扔进去,维奥拉。

感谢您将我推向正确的方向,从那里很容易弄清楚!

标签: pythonpython-2.7listtuplesenumeration

解决方案


您自己解决了大部分问题(计算单词、行数、行号等) - 您可以在浏览文件时简单地记住最后 n 行。

例子:

t = """"zero line
one line
two line
three line
four line 
five line 
six line
seven line 
eight line
""" 

last5 = [] # memory cell
for l in t.split("\n"):  # similar to your for line in file: 
    last5[:] = last5[-4:]+[l] # keep last 4 and add current line, inplace list mod 

    if "six" in l:
        print last5

您还可以查看deque并指定一个最大长度(您需要导入它)

from collections import deque

last5 = deque(maxlen=5)
for l in t.split("\n"): 
    last5.append(l) # will automatically only keep 5 (maxlen)

    if "six" in l:
        print last5

输出:

 # list version
 ['two line', 'three line', 'four line ', 'five line ', 'six line'] 

 # deque version
 deque(['two line', 'three line', 'four line ', 'five line ', 'six line'], maxlen=5) 

推荐阅读