【问题标题】:How to Filter specific values against specific words from text file and store it in list?如何根据文本文件中的特定单词过滤特定值并将其存储在列表中?
【发布时间】:2011-07-17 11:47:48
【问题描述】:

就像我有一个文本文件 abc.txt,它是这样的

we 2 rt 3 re 3 tr vh kn mo
we 3 rt 5 re 5 tr yh kn me
we 4 rt 6 re 33 tr ph kn m3
we 5 rt 9 re 34 tr oh kn me
we 6 rt 8 re 32 tr kh kn md

现在我想要针对 tr 的值,过滤后它应该得到这个结果

[vh,yh,ph,oh,kh]

谁能告诉我该怎么做。应该为它写什么代码

【问题讨论】:

    标签: python filtering


    【解决方案1】:

    可以尝试以下方法:

    def filter_words(filename, magic_word):
        with open(filename) as f:
            all_words = f.read().strip().split()
            filtered_words = []
            i = 0
            while True:
                try:
                    i = all_words.index(magic_word, i) + 1
                    filtered_words.append(all_words[i])
                except IndexError, ValueError:
                    break
            return filtered_words
    

    如果 'tr' 恰好是提供的文本文件中的最后一个单词,此算法不会失败。

    例子:

    >>> filter_words('abc.txt', 'tr')
    ['vh', 'yh', 'ph', 'oh', 'kh']
    

    【讨论】:

      【解决方案2】:

      使用正则表达式会不会更简单?

      如果 'we' 、 'rt' 、 're' 、 'tr' 在它们的位置上真的是不变的:

      import re
      
      ch = '''
      we 2 rt 3 re 3 tr vh kn mo
      we 3 rt 5 re 5 tr yh kn me
      we 4 rt 6 re 33 tr ph kn m3
      we 5 rt 9 re 34 tr oh kn me
      we 6 rt 8 re 32 tr kh kn md'''
      
      print re.findall('(?<= tr )([^ ]+)',ch)
      

      如果不是,那么位置就是确定要捕获什么的标准:

      import re
      
      ch = '''
      we 2 rt 3 re 3 tr vh kn mo
      we 3 rt 5 re 5 tr yh kn me
      we 4 rt 6 re 33 tr ph kn m3
      we 5 rt 9 re 34 tr oh kn me
      we 6 rt 8 re 32 tr kh kn md'''
      
      print [ mat.group(1)
              for mat in re.finditer('^(?:\w+ \d+ ){3}\w+ ([^ ]+) .+',ch,re.M)]
      

      【讨论】:

        【解决方案3】:

        before trafter tr 可以拆分行,获取第二部分的第一个单词。

        [ line.split(' tr ')[1].split()[0] for line in file ] 
        

        如果有多个tr,则表达式收集第一个之后的单词。或者,这个收集了最后一个 tr 之后的单词:

        [ line.split(' tr ')[-1].split()[0] for line in file ]
        

        【讨论】:

          【解决方案4】:
          mylist = [line.split()[7] for line in myfile] 
          

          如果它总是第 8 列应该可以工作。

          如果tr的位置是可变的,你可以这样做

          mylist = []
          for line in myfile:
              items = line.split()
              mylist.append(items[items.index("tr")+1])
          

          【讨论】:

          • 更好line.split(' tr ')[1].split()[0]
          • @junjanes:非常聪明!您应该将此作为答案发布。
          • 我会把它留给你,因为你的回答是触发因素:)
          • @junjanes:如果一个平庸的解决方案激发了一个聪明的解决方案,那么应该归功于聪明解决方案的作者。
          • @Rafe Kettler line.split(' tr ') 是一个列表。 line.split(' tr ')[1] 是一个字符串。
          【解决方案5】:
          from operator import itemgetter
          
          # tr value is in the 8th column
          tr = itemgetter(7)
          
          print map(tr, (line.split() for line in myfile.readlines()))
          

          【讨论】:

            【解决方案6】:

            如果我理解正确,这样的事情应该可以完成工作(未经测试):

            resultArray = []
            for aString in yourFile:
                anArray = aString.split()
                for i in range(0, len(anArray) - 1):  //-1 in case tr is at the end of array
                    if anArray[i] == 'tr':
                        resultArray.append(anArray[i + 1])
            

            【讨论】:

              【解决方案7】:

              你的问题不是很清楚。这就是你所追求的吗?

              [line.split()[7] for line in open("abc.txt")]
              

              它从每一行返回第八个“单词”。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-02-23
                • 2016-01-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-09-08
                相关资源
                最近更新 更多