在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。无论如何,我认为投反对票是不应该的。但是,请始终尝试提供独立/工作代码,以便人们可以复制并运行它。:)对不起,我不确定我以前是否做过。我现在看看。您的评论很好,我将确保下次提供副本并运行代码。我每天都学习。