如何在特定索引的文件中查找列表值的所有实例(例如:[1,2,3])

时间:2017-02-15 10:19:53

标签: python

我想在特定索引的文件中找到元素列表。

例如,以下是文件" 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

现在,我需要找出上面文件中每行第2列依次发生的值列表[1,2,3]。

输出应如下所示:

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

有人可以帮助我找到上述代码的问题吗?或者甚至是一个能提供正确输出的不同逻辑也没关系。

2 个答案:

答案 0 :(得分: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 :(得分:1)

您的代码存在缺陷。最突出的错误:使用行号在文本文件中尝试seek永远不会起作用:你必须使用字节偏移量。即使你这样做,也是错误的,因为你在线上进行迭代,所以在这样做时你不应该尝试改变文件指针。

我的方法:

我们的想法是“转置”你的文件以使用垂直向量,在第二个垂直向量中找到序列,并使用找到的索引在第一个垂直向量上提取数据。

split行获取文字&数字,压缩结果以获得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')]