我想在特定索引的文件中找到元素列表。
例如,以下是文件" 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
有人可以帮助我找到上述代码的问题吗?或者甚至是一个能提供正确输出的不同逻辑也没关系。
答案 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')]