【问题标题】:Python: Finding values after searching for a string in a text filesPython:在文本文件中搜索字符串后查找值
【发布时间】:2013-09-10 09:04:13
【问题描述】:

我是 python 世界的新手,我正在尝试从多个文本文件中提取值。我可以通过循环很好地打开文件,但我正在寻找一种直接的方式来搜索字符串,然后返回它之后的值。

我的结果文本文件如下所示

SUMMARY OF RESULTS
Max tip rotation =,-18.1921,degrees
Min tip rotation =,-0.3258,degrees
Mean tip rotation =,-7.4164,degrees
Max tip displacement =,6.9956,mm
Min tip displacement =,0.7467,mm
Mean tip displacement = ,2.4321,mm
Max Tsai-Wu FC =,0.6850
Max Tsai-Hill FC =,0.6877

所以我希望能够搜索说“Max Tsai-Wu =”,它返回 0.6850 我希望能够搜索字符串,因为每个变量的位置可能会在以后发生变化。

很抱歉发布这么简单的问题,只是似乎无法找到一种直接可靠的方法来找到它。

任何帮助将不胜感激! 马特

【问题讨论】:

  • 比较小,最多200行左右

标签: python text-files


【解决方案1】:

你可以使用正则表达式:

import re


regexp = re.compile(r'Max Tsai-Wu.*?([0-9.-]+)')
with open('input.txt') as f:
    for line in f:
        match = regexp.match(line)
        if match:
            print match.group(1)

打印:

0.6850

UPD:将结果放入列表中

import re


regexp = re.compile(r'Max Tsai-Wu.*?([0-9.-]+)') 
result = []
with open('input.txt') as f:
    for line in f:
        match = regexp.match(line)
        if match:
            result.append(match.group(1))

【讨论】:

  • 非常感谢!请问Max Tsai-Wu之前的r是做什么的?还有 .*?([0-9.-]+)?
  • @user2739143,当然,r 意味着它只是一个raw string.*?([0-9.-]+): .*? 这里表示对任何字符集的非贪婪匹配 - 在这种情况下,它将匹配 Max Tsai-Wu 和您的浮点数之间的任何内容,([0-9.-]+) 是您要提取的浮点数的捕获组.
  • 谢谢老兄,真的帮了大忙!
  • 我可以再问一个问题吗!假设我想创建一个从该循环中获取的所有值的列表,我将如何创建一个包含所有值的列表,即类似这样的列表 listOfMaxTipRotation = listOfMaxTipRotation , maxTipRotation
  • 很抱歉打扰您,刚刚又收到了一个简短的问题。我正在尝试将获得的数据导出到 CSV 文件,但是当我导出它时,列表的任一侧仍然有 []。我该如何摆脱它们?另外每个值都有''两边,我该如何删除它们?谢谢!
【解决方案2】:

我最喜欢的方法是测试该行是否以所需的文本开头:

keyword = 'Max Tsai-Wu' 
if line.startswith(keyword):

然后用逗号分割行并返回值

try:
    return float(line.split(',')[1])
except ValueError:
    # treat the error

【讨论】:

    【解决方案3】:

    您可以使用正则表达式来查找名称和值:

    import re
    
    RE_VALUE = re.compile('(.*?)\s*=,(.*?),')
    
    def test():
        line = 'Max tip rotation =,-18.1921,degrees'
        rx = RE_VALUE.search(line)
        if rx:
            print('[%s] value: [%s]' % (rx.group(1), rx.group(2)))
    
    
    test()
    

    这样逐行读取文件可以填充一些字典。

    我的正则表达式使用逗号之间的值。

    【讨论】:

      【解决方案4】:

      如果文件不是那么大,您可以这样做:

      import re
      files = [list, of, files]
      for f in files:
          with open(f) as myfile:
              print re.search(r'Max Tsai-Wu.*?=,(.+)', myfile.read()).group(1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多