2013-02-18 100 views
0

讀取文件我有使用Python來處理跟蹤文件(包含十億行數據)關於一個問題。蟒蛇從當前行

我想要做的是,該程序會發現文件在一個特定行(說這是行#x)和它需要查找的文件從該另一個符號(行號X)。一旦找到該行,再從(行#x)開始搜索另一行。

我現在所做的是如下,但問題是它始終需要重新打開文件並從頭開始查找匹配項(行#> x,幷包含我想要的符號)。對於一個大的跟蹤文件,處理時間太長。

1.

for line in file.readlines() 
     i++ #update the line number 
     if i > x: 
      if (line.find()): 

或:

for i, line in enumerate(open(file)): 
     if i > x: 
      if .... 

任何人都可以給我一個提示上更好的想法?

感謝

回答

2

如果文件,否則穩定,使用fileobj.tell()記住您在文件中的位置,然後在下一次使用fileobj.seek(pos)返回到文件在同一位置。

這僅如果你不使用的文件對象作爲一個迭代器(無for line in fileobject)next(fileobject))作爲使用預讀緩衝區,將模糊的確切位置工作。

相反,使用:

for line in iter(fileobj.readline, ''): 

仍然在迭代上下文中使用fileobj

+0

謝謝,這確實有很大的幫助 – dylanoo 2013-02-18 20:24:28

0

我建議你使用隨機訪問,並記錄在您的線路開始。喜歡的東西:

index = [] 

fh = open(gash.txt) 

for line in fh: 
    if target in line: 
     index.append(fh.tell() - len(line)) 

然後,當你要調用的內容,使用fh.seek(index[n])

幾個「陷阱」的:

  1. 注意,索引位置不會是相同的行號。如果您需要行號,那麼可以使用字典,行號作爲關鍵字。

  2. 在Windows上,你將不得不-1調整文件位置。這是因爲「\ r」被刪除並且不出現在len(line)中。

+0

這不會是準確的。 '用於fh'行使用'fh'作爲一個迭代,在該點該文件中的塊大(幾千字節順序)讀出。 'fh.tell()'會隨着那些較大的緩衝區讀取而跳轉。 – 2013-02-18 17:29:46

+0

此外,爲什麼不使用*以前*調用'fh.tell()'來確定的線路開始了嗎?爲什麼要減去'len(line)'* *? – 2013-02-18 17:30:12