Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在更正if语句之前打印X行_Python_Python 2.7_List_Tuples_Enumeration - Fatal编程技术网

Python 如何在更正if语句之前打印X行

Python 如何在更正if语句之前打印X行,python,python-2.7,list,tuples,enumeration,Python,Python 2.7,List,Tuples,Enumeration,我对Python非常陌生,对我在众多网页中找到的东西只有零碎的知识 也就是说,我试图在一个文件(~10k行)中搜索我编写的一组类似“过滤器”的条件,然后我希望它打印出符合条件的行,以及一行之前的X行数 我已经创建了以下脚本来打开所述文件,逐行迭代,并将符合筛选条件的行打印到输出文件中,但是我对如何将其合并到当前脚本中感到困惑 import os output_file = 'Output.txt' filename = 'BigFile.txt' numLi

我对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
,但我不认为我可以直接用
line-5
这样的语句来打印
行之前的5行:

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 vs lst操作和错误问题作斗争。只是决定回到原来的剧本,一时兴起把它扔进去,维奥拉


谢谢你把我推向了正确的方向,从那里很容易就明白了

你自己解决了大部分问题(计算单词、行数、行号等) -在浏览文件时,您可以简单地记住最后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
您还可以查看并指定最大长度(需要导入)

输出:

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

你自己解决了大部分问题(计算单词、行数、行号等) -在浏览文件时,您可以简单地记住最后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
您还可以查看并指定最大长度(需要导入)

输出:

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

我把东西输出到字典,而不是写入文件。处理完整个文件后,汇总数据字典将以
json
的形式转储到文件中。使用Artner的测试文件

import os
import json

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

#initiate output container
outDict = {}
for fields in ['numLines', 'numWords', 'numChrs', 'numMes']:
    outDict[fields] = 0

outDict['lineNum'] = []    

with open(filename, 'r') as file:
    for line in file:
      wordsList = line.strip().split("\s")
      outDict['numLines'] += 1
      outDict['numWords'] += len(wordsList)
      outDict['numChrs'] += len(line)

      #find items in the line
      if "t" in line:
          outDict['numMes'] += 1
          #save line number
          outDict['lineNum'].append(outDict['numLines']) 
          #save line content
          outDict['lineList'].append(line)

#record output          
with open(output_file, 'w') as f1:
    f1.write(json.dumps(outDict))    

##print lines of desire
#x number of lines before
x=5    
with open(filename, 'r') as file:
    for i, line in enumerate(file):
        #iterate over line numbers for which condition is met
        for j in range(0,len(outDict['lineNum'])):
            #if line number is between found line num and line num minus x, print
            if (outDict['lineNum'][j]-x) <= i <= outDict['lineNum'][j]:
                print(line)
导入操作系统
导入json
输出文件='output.txt'
文件名='BigFile.txt'
#启动输出容器
outDict={}
对于['numLines'、'numWords'、'numChrs'、'numMes'中的字段:
outDict[字段]=0
outDict['lineNum']=[]
打开(文件名为“r”)作为文件:
对于文件中的行:
wordsList=line.strip().split(“\s”)
outDict['numLines']+=1
outDict['numWords']+=len(单词列表)
输出['numChrs']+=len(行)
#查找行中的项目
如果“t”在直线上:
输出['numes']+=1
#保存行号
outDict['lineNum'].append(outDict['numLines'])
#保存行内容
outDict['lineList'].追加(行)
#记录输出
打开(输出_文件“w”)为f1时:
f1.write(json.dumps(outDict))
##印刷欲望的线条
#x之前的行数
x=5
打开(文件名为“r”)作为文件:
对于i,枚举(文件)中的行:
#迭代满足条件的行号
对于范围(0,len)(outDict['lineNum'])内的j:
#如果行号介于找到的行数和行数减去x之间,则打印

如果(outDict['lineNum'][j]-x)不是写入文件,而是将内容输出到字典。处理完整个文件后,汇总数据字典将以
json
的形式转储到文件中。使用Artner的测试文件

import os
import json

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

#initiate output container
outDict = {}
for fields in ['numLines', 'numWords', 'numChrs', 'numMes']:
    outDict[fields] = 0

outDict['lineNum'] = []    

with open(filename, 'r') as file:
    for line in file:
      wordsList = line.strip().split("\s")
      outDict['numLines'] += 1
      outDict['numWords'] += len(wordsList)
      outDict['numChrs'] += len(line)

      #find items in the line
      if "t" in line:
          outDict['numMes'] += 1
          #save line number
          outDict['lineNum'].append(outDict['numLines']) 
          #save line content
          outDict['lineList'].append(line)

#record output          
with open(output_file, 'w') as f1:
    f1.write(json.dumps(outDict))    

##print lines of desire
#x number of lines before
x=5    
with open(filename, 'r') as file:
    for i, line in enumerate(file):
        #iterate over line numbers for which condition is met
        for j in range(0,len(outDict['lineNum'])):
            #if line number is between found line num and line num minus x, print
            if (outDict['lineNum'][j]-x) <= i <= outDict['lineNum'][j]:
                print(line)
导入操作系统
导入json
输出文件='output.txt'
文件名='BigFile.txt'
#启动输出容器
outDict={}
对于['numLines'、'numWords'、'numChrs'、'numMes'中的字段:
outDict[字段]=0
outDict['lineNum']=[]
打开(文件名为“r”)作为文件:
对于文件中的行:
wordsList=line.strip().split(“\s”)
outDict['numLines']+=1
outDict['numWords']+=len(单词列表)
输出['numChrs']+=len(行)
#查找行中的项目
如果“t”在直线上:
输出['numes']+=1
#保存行号
outDict['lineNum'].append(outDict['numLines'])
#保存行内容
outDict['lineList'].追加(行)
#记录输出
打开(输出_文件“w”)为f1时:
f1.write(json.dumps(outDict))
##印刷欲望的线条
#x之前的行数
x=5
打开(文件名为“r”)作为文件:
对于i,枚举(文件)中的行:
#迭代满足条件的行号
对于范围(0,len)(outDict['lineNum'])内的j:
#如果行号介于找到的行数和行数减去x之间,则打印

如果(outDict['lineNum'][j]-x)这里的解决方案与@PatricArtner建议的相同,但是使用了环形缓冲区。它可能(也可能不是,我没有检查)在处理大文件时工作得更快。 想法很简单:我们可以创建一个具有所需大小(您应该保留的行数)的列表和一个当前录制位置的计数器
cnt
。对于每一条新线,我们应该将cnt增加1,并根据缓冲区的大小进行模运算。因此,
cnt
在列表中循环。例如,如果列表大小为5
cnt=(cnt+1)%5
将给出
0 1 2 3 4 0 1 2
,依此类推。每一步
cnt
都将指向列表中最旧的数据,这些数据将被新数据取代。下面是一个实现示例

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


last5 = [None,None,None,None,None]
cnt = 0
for l in t.split("\n"):
  last5[cnt]=l
  if 'six' in l:
    print last5[(cnt+1)%5]
    print last5[(cnt+2)%5]
    print last5[(cnt+3)%5]
    print last5[(cnt+4)%5]
    print last5[(cnt+0)%5]
    print
  cnt = (cnt+1)%5
输出非常简单:

None
None
None
"zero line
six line - surprize 

two line
three line
four line 
five line 
six line
注意:如果你从一个文件中读取,而该文件非常大,并且需要保留的字符串非常大(例如,基因序列),并且你的病情不会经常触发,请注意,不要在内存中保留字符串。在文件中创建位置列表
$ grep -B 5 six test.txt 
one line
two line
three line
four line 
five line 
six line