Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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
打印特定行txt文件python_Python - Fatal编程技术网

打印特定行txt文件python

打印特定行txt文件python,python,Python,我想分析一个文本文件。我试图找到包含某些字符的每一行(例如:“@”),然后打印位于它前面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

我想分析一个文本文件。我试图找到包含某些字符的每一行(例如:“@”),然后打印位于它前面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

它不会工作(当我给它输入一个包含“@”行的文件时,它不会打印任何内容),有什么想法吗?

对于文件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

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

其次,您的索引逻辑有点复杂。假设您的文件相对于内存大小来说不是很大,那么简单地将整个文件读入内存(作为列表)并在内存中进行操作就容易多了

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

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

您的程序语法不正确(意图问题)。请你先修一下好吗。接下来,请您指定“不起作用”。(当然,您应该摆脱对同一文件描述符的“嵌套”读取…)太棒了!如果我匹配多个“@”,例如,该行应该包含以下任何(不一定全部)“邮件”、“@”、“用户”,其中itsat=re.search(r'@|mail|user',行)