在python中,如何基于列表中的头和值从一个文件中提取字符?

在python中,如何基于列表中的头和值从一个文件中提取字符?,python,Python,我有一个巨大的文件,看起来像这样: -HVC1 tank Contains300gallons -HVC2 tank Contains20gallonsofgasand220galonsofkero s = [['-HVC1', '0', '8'], ['-HVC1', '12', '18'], ['-HVC2', '9', '17']] 第二个文件是我读到的列表,如下所示: -HVC1 tank Contains300gallons -HVC2 tank Contains20gallons

我有一个巨大的文件,看起来像这样:

-HVC1 tank
Contains300gallons
-HVC2 tank
Contains20gallonsofgasand220galonsofkero
s = [['-HVC1', '0', '8'], ['-HVC1', '12', '18'], ['-HVC2', '9', '17']]
第二个文件是我读到的列表,如下所示:

-HVC1 tank
Contains300gallons
-HVC2 tank
Contains20gallonsofgasand220galonsofkero
s = [['-HVC1', '0', '8'], ['-HVC1', '12', '18'], ['-HVC2', '9', '17']]
我需要比较文件中与给定行关联的每个字符的位置,例如-HVC1或-HVC2 查看是否与列表中的HVC1或HCV2等匹配。在此基础上,提取列表中其他2个值范围内的字符,例如0、8;12,18; 9,17

此示例列表的预期结果为:

-HVC1
Contains
-HVC1
gallons
-HVC2
20gallons
我的代码:

import csv

sequence =[]
with open('my_huge_file', 'r') as f:
    lines = f.readlines()
    dic = {}
    for line in lines:
        if line.startswith('-'):
            tx = line.split('tank', 1)[0] #include everything before tank in header
        else:
            gh = line[:-1]
            dic[tx] = gh

    s = [['-HVC1', '0', '8'], ['-HVC1', '12', '18'], ['-HVC2', '9', '17']]
    for i in s:
        seq =[]
        for m, n in dic.items():
            for j, k in enumerate(n):
                if int(i[1]) <= j <= int(i[2]) and m == i[0]:
                    seq.append(k)
        sequence.append(seq)
print(sequence)
我知道我做错了什么,但我认为我的逻辑是有道理的。任何帮助都将不胜感激(最好有解释)
打印顺序的结果应为:

[[Contains], [gallons], [20gallons]]

然后将其格式化为上面所示的预期结果。评论是正确的:在这种情况下,调试非常有帮助

问题在于比较
m==i[0]
:在第一次迭代中
m
'-HVC1'
,而
i[0]
'-HVC1'
。因此,比较总是
False
。解决方案是去除空白:

lines = ['-HVC1 tank', 'Contains300gallons', '-HVC2 tank',
        'Contains20gallonsofgasand220galonsofkero']

sequence = []
dic = {}
for line in lines:
    if line.startswith('-'):
        tx = line.split('tank', 1)[0]
    else:
        gh = line[:-1]
        # THE FIX IS HERE: Strip the white spaces in ``tx``
        dic[tx.strip()] = gh

s = [['-HVC1', '0', '8'], ['-HVC1', '12', '18'], ['-HVC2', '9', '17']]
for i in s:
    seq = []
    for m, n in dic.items():
        for j, k in enumerate(n):
            if (int(i[1]) <= j <= int(i[2])) and (m == i[0]):
                seq.append(k)
    sequence.append(seq)

print(sequence)

csv.reader
中的
f1
是什么?f1是我读入列表的另一个文件。也许我只是删除了它,然后再看看列表什么是
打印(序列)
的输出?打印序列的结果应该是比较结果的列表。然后,我将在预期结果中按照上面所示的格式对其进行格式化。但是如果它可以直接转到上面的预期结果,我不会介意是的,基于我的代码,我的结果是一个空列表[…]、[…]、[…]、[…]、[…]是的,非常感谢。只要去掉空白就可以得到我想要的结果。我已经搜索了整个堆栈溢出的答案,但没有相关的。很高兴能提供帮助。如果这解决了你的问题,请接受答案。ps:如果你想投入一些时间,可以做一些改变来提高可读性和性能,但这不在目前的范围之内是的,我已经接受了。我投了反对票,也许这是理所当然的。我应该详细地看一下代码,你投了赞成票,没有被接受:D。无论如何,我认为投反对票是不应该的。但是,请始终尝试提供独立/工作代码,以便人们可以复制并运行它。:)对不起,我不确定我以前是否做过。我现在看看。您的评论很好,我将确保下次提供副本并运行代码。我每天都学习。