2015-04-05 146 views
0

我有一個我希望分析的文本文件。我試圖找到包含某些字符的每一行(例如:「@」),然後打印位於它前面3行的行(例如,如果第5行包含「@」,我想打印第2行) This是我走到這一步:打印特定行txt文件python

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

您的程序在語法上不是正確的(意向問題)。請你先解決這個問題。接下來,請你指定「不能工作」。 (當然,你應該擺脫相同的文件描述符的「嵌套」閱讀...) – flaschbier 2015-04-05 20:42:38

+1

@flaschbier完成 – 2015-04-05 20:48:15

回答

-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 
+0

太棒了!如果我要比「@」匹配,例如該行應包含以下任何(不一定全部)(「mail」,「@」,「user」) – 2015-04-05 21:57:05

+0

WhereItsAt = re.search(r'@ | mail | user',line) – kpie 2015-04-12 23:52:08

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 
[email protected] 
hello world will print 
null 
null 
@@ 
-1

好了,問題是,你已經在第4行完全迭代通過文件描述符file當你在第11行再試一次。所以第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:] 
-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])) 
+0

爲什麼要投票? – Tom 2015-04-07 18:43:46