我有一个我想分析的文本文件。我试图找到包含某些字符的每一行(例如“@”),然后打印前面有3行的行(例如:如果第5行包含“@”,我想打印第2行) 这是我到目前为止所得到的:
file = open('new_file.txt', 'r')
a = list()
x = 0
for line in file:
x = x + 1
if '@' in line:
a.append(x)
continue
x = 0
for index, item in enumerate(a):
for line in file:
x = x + 1
d = a[index]
if x == d - 3:
print line
continue
它不起作用(当我提供包含“@”的行的文件时,它什么都不打印),有什么想法吗?
答案 0 :(得分:0)
首先,您将多次浏览该文件,而不会在以后的时间重新打开它。这意味着所有后续迭代文件的尝试都将立即终止而不会读取任何内容。
其次,你的索引逻辑有点复杂。假设你的文件相对于你的内存大小并不大,那么简单地将整个文件读入内存(作为列表)并在那里操作就更容易了。
myfile = open('new_file.txt', 'r')
a = myfile.readlines();
for index, item in enumerate(a):
if '@' in item and index - 3 >= 0:
print a[index - 3].strip()
已在以下输入中测试过:
PrintMe
PrintMe As Well
Foo
@Foo
Bar@
hello world will print
null
null
@@
答案 1 :(得分:-1)
对于文件IO,程序员时间和运行时通常最有效地使用reg-ex来匹配模式。结合迭代文件中的行。你的问题确实不是问题。
import re
file = open('new_file.txt', 'r')
document = file.read()
lines = document.split("\n")
LinesOfInterest = []
for lineNumber,line in enumerate(lines):
WhereItsAt = re.search( r'@', line)
if(lineNumber>2 and WhereItsAt):
LinesOfInterest.append(lineNumber-3)
print LinesOfInterest
for lineNumber in LinesOfInterest:
print(lines[lineNumber])
兴趣点现在是符合条件的行号列表
我用过
line1,0
line2,0
line3,0
@
line1,1
line2,1
line3,1
@
line1,2
line2,2
line3,2
@
line1,3
line2,3
line3,3
@
作为输入产生
[0, 4, 8, 12]
line1,0
line1,1
line1,2
line1,3
答案 2 :(得分:-1)
好的,问题是当你在第11行再试一次时,你已经完全遍历第4行的文件描述符file
。因此第11行将进行空循环。也许最好只迭代一次文件并记住最后几行...
file = open('new_file.txt', 'r')
a = ["","",""]
for line in file:
if "@" in line:
print(a[0], end="")
a.append(line)
a = a[1:]
答案 3 :(得分:-1)
你可以使用这样的东西。
class RingBuffer(object):
def __init__(self, size):
self.list = [None for i in xrange(size)]
def append(self, x):
self.list.pop(0)
self.list.append(x)
buf = RingBuffer(4)
lines = [
'111',
'@222',
'333',
'444',
'@555',
'@666',
'777',
'888'
]
for l in lines:
buf.append(l)
if ('@' in l):
print ("{0}".format(buf.list[0]))