2017-02-15 65 views
1

我想找出特定索引處文件中元素的列表。如何在特定索引的文件中查找列表值的所有實例(例如:[1,2,3])

對於離,下面是該文件「TEMP.TXT」

line_0 1 
line_1 2 
line_2 3 
line_3 4 
line_4 1 
line_5 1 
line_6 2 
line_7 1 
line_8 2 
line_9 3 
line_10 4 

的內容現在,我需要找出值[1,2,3]在第2列中出現的序列的列表中上面的文件中的每一行。

輸出應該如下:

line_2 3 
line_9 3 

我曾嘗試下面的邏輯,但一些如何不工作;(

inf = open("temp.txt", "rt") 
    count = 0 
    pos = 0 
    ListSeq = ["1","2","3"] 
    for line_no, line in enumerate(inf): 
     arr = line.split() 
     if len(arr) > 1: 
     if count == 1 : 
      pos = line_no 
     if ListSeq[count] == arr[1] : 
      count += 1 
     elif count > 0 : 
      inf.seek(pos) 
      line_no = pos 
      count = 0 
     else : 
      count = 0    
     if count >= 3 : 
     print(line) 
     count = 0 

有人可以幫我找到上面的代碼問題?或甚至是一個不同的邏輯,這將給出正確的輸出也是很好的

+0

*在每行的索引2處按順序出現* - 您能否詳細說明? – RomanPerekhrest

+0

@RomanPerekhrest:我編輯了這個問題,我的意思是第2列,而不是第2列。 – programmerDaemon

回答

1

您的代碼有缺陷。最突出的錯誤:在使用行號的文本文件中嘗試seek永遠不會起作用:您必須使用字節偏移。即使你這樣做了,它也會是錯誤的,因爲你正在迭代行,所以你不應該試圖改變文件指針。

我的方法:

的想法是「轉」你的文件與垂直矢量工作,發現在2號垂直向量的序列,並使用發現指數在第一垂直矢量提取數據。

split要獲得文本的線&編號,zip結果得到2個向量:1個文本的數字1。

此時,一個列表包含["line_0","line_1",...],另一個包含["1","2","3","4",...]

查找的號碼錶中序列的指標,發現當打印夫婦TXT /數字。

代碼:

with open("text.txt") as f: 
    sequence = ('1','2','3') 
    txt,nums = list(zip(*(l.split()[:2] for l in f))) # [:2] in case there are more columns 
    for i in range(len(nums)-len(sequence)+1): 
     if nums[i:i+len(sequence)]==sequence: 
      print("{} {}".format(txt[i+2],nums[i+2])) 

結果:

line_2 3 
line_9 3 

最後for迴路可以通過列表理解來代替生成的元組:

result = [(txt[i+2],nums[i+2]) for i in range(len(nums)-len(sequence)) if nums[i:i+len(sequence)]==sequence ] 

結果:

[('line_2', '3'), ('line_9', '3')] 
+0

這是給出預期的輸出。但我對理解邏輯有點困難,因爲我是Python的初學者。在接受這個答案之前,我會尋找一個更簡單的解決方案(時間對我來說不是一個限制)。 - 感謝 – programmerDaemon

+0

我的編輯,我加了一些解釋 –

+0

現在更清楚了。 – programmerDaemon

1

推廣任何序列和任何列

sequence = ['1','2','3'] 
col = 1 

with open(filename, 'r') as infile: 
    idx = 0 
    for _i, line in enumerate(infile): 
     if line.strip().split()[col] == sequence[idx]: 
      if idx == len(sequence)-1: 
       print(line) 
       idx = 0 
      else: 
       idx += 1 
     else: 
      idx = 0 
+1

int()可能會引發異常 – MKesper

+0

這不會提供我正在查找的輸出,請參閱後面提到的輸出格式。 我必須在每行的第二列中找到[1,2,3]的序列,並且如果找到序列,則打印任何元素的索引。 – programmerDaemon

+0

@programmerDaemon我重讀你的問題並相應地修改我的代碼,只有我不清楚的是你正在尋找的輸出格式:你想打印_index_還是整行? –

相關問題