【问题标题】:Extract specific word and the value after it from text file从文本文件中提取特定单词及其后面的值
【发布时间】:2015-11-18 00:04:02
【问题描述】:

我的输入文件为:

1 sentences, 6 words, 1 OOVs
1 zeroprobs, logprob= -21.0085 ppl= 15911.4 ppl1= 178704
6 words, rank1= 0 rank5= 0 rank10= 0
7 words+sents, rank1wSent= 0 rank5wSent= 0 rank10wSent= 0 qloss= 0.925606 absloss= 0.856944

file input.txt : 1 sentences, 6 words, 1 OOVs
1 zeroprobs, logprob= -21.0085 ppl= 15911.4 ppl1= 178704
6 words, rank1= 0 rank5= 0 rank10= 0
7 words+sents, rank1wSent= 0 rank5wSent= 0 rank10wSent= 0 qloss= 0.925606 absloss= 0.856944

我想提取单词 ppl 和它后面的值,在这种情况下:ppl=15911.4

我正在使用此代码:

with open("input.txt") as openfile:
    for line in openfile:
       for part in line.split():
          if "ppl=" in part:
              print part

但是,这只是提取单词 ppl 而不是值。我还想打印文件名。

预期输出:

input.txt, ppl=15911.4

我该如何解决这个问题?

【问题讨论】:

  • 那是因为你被一个空格分割。 ppl 的值将是列表中的下一个元素。如果可以选择修改文件,请考虑删除等号后的空格。
  • 问题是我有一个文件夹,里面装满了这种格式的文件,我无法修改输入文件:(
  • 一种方法是将文件读入字符串,然后匹配正则表达式/\b(?<=ppl= )\d+\.\d/\b 是一个分词(?<=ppl= ) 是一个肯定的后视,它断言匹配紧跟在"ppl= " 之前。

标签: python python-2.7 extract word


【解决方案1】:

你可以使用enumerate函数,

with open("input.txt") as openfile:
    for line in openfile:
       s = line.split()
       for i,j in enumerate(s):
          if j == "ppl=":
              print s[i],s[i+1]

例子:

>>> fil = '''1 zeroprobs, logprob= -21.0085 ppl= 15911.4 ppl1= 178704
6 words, rank1= 0 rank5= 0 rank10= 0'''.splitlines()
>>> for line in fil:
        s = line.split()
        for i,j in enumerate(s):
            if j == "ppl=":
                print s[i],s[i+1]


ppl= 15911.4
>>> 

只打印第一个值,

>>> for line in fil:
        s = line.split()
        for i,j in enumerate(s):
            if j == "ppl=":
                print s[i],s[i+1]
        break

ppl= 15911.4

【讨论】:

  • 两次??,如何... 是否有任何其他字符串与确切名称 ppl=
  • 糟糕!是的,这个词和价值在重复。我会发布完整的文件。对不起,我错了。一秒。
  • 使用 break 后没有打印任何内容 :(
  • 有什么错误吗?怎么可能?请注意,您需要为第一个 for 循环而不是第二个循环添加 break stmt。
  • 我不知道它不起作用:(也许输入文件有问题。我会检查一下:) 但是,我得到了输出。非常感谢您的时间和想法。它帮助很大。
【解决方案2】:

您可以使用一个简单的计数器来修复它:

found = False
with open("input.txt") as openfile:
     for line in openfile:
         if not found:
             counter = 0
             for part in line.split():
                  counter = counter + 1
                  if "ppl=" in part:
                      print part
                      print line.split()[counter]
                      found = True

【讨论】:

  • 由于单词的存在而打印了两次 :( 如何让它只打印一次。
【解决方案3】:

您可以将 line.split() 生成的列表分配给一个变量,然后使用带有 i 作为计数器的 while 循环进行迭代,当您点击 'ppl=' 时,您可以返回 'ppl=' 和下一个索引

with open("input.txt") as openfile:
for line in openfile:
    phrases = line.split()
    i = 0
    while i < len(phrases):
        if 'ppl=' in phrases[i]
            print "ppl= " + str(phrases[i + 1])
        i += 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多