繁体   English   中英

打印特定行的txt文件python

[英]Printing specific lines txt file python

我有一个要分析的文本文件。 我正在尝试查找包含某些字符的每一行(例如:“ @”),然后在其之前打印位于三行的行(例如:如果第5行包含“ @”,我想打印第二行)我到目前为止所得到的:

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

它不起作用(当我将包含“ @”的行输入文件时,它什么也不打印),有什么主意吗?

首先,您要遍历文件多次,而无需在以后的时间重新打开它。 这意味着所有后续迭代文件的尝试将立即终止,而不读取任何内容。

其次,您的索引逻辑有些混乱。 假设您的文件相对于内存大小而言并不庞大,那么将整个内容读入内存(作为列表)并在那里进行操作要容易得多。

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
@@

对于文件IO,使用正则表达式匹配模式通常对于程序员的时间和运行时最有效。 与遍历文件中各行的迭代结合。 您的问题确实不是问题。

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

好的,问题是,当您在第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:]

您可以使用类似这样的东西。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM