【问题标题】:exporting selected rows into list in python将选定的行导出到python中的列表中
【发布时间】:2019-08-18 21:12:00
【问题描述】:

我有一个像这个小例子这样的文本文件:

小例子:

</Attributes>
ENDI,ERT,GFTR,29
ENDI,XCV,HGJ,36
TOC,FGNH,TRYCB,3742
TOC,MVCL,KJDSFH,38799
GOF,KLJG,XZCJV,31
GOF,LKBFV,JKSDHF,18

我想选择一些行并将第 4 列(这些行以逗号分隔)添加到 python 列表中。关键是所有行都不是逗号分隔的,但我感兴趣的行是逗号分隔的。这是预期的输出:

TOC = [3742, 38799]
GOF = [31, 18]

我在 python 中编写了以下代码。但不返回预期的输出。你知道怎么解决吗?

TOC = []
GOF = []
file = open('file.txt') as f:
    for line in file:
        if line.startswith("TOC"):
            TOC.append(line[3])
        if line.startswith("GOF"):
            GOF.append(line[3])

【问题讨论】:

    标签: python list file


    【解决方案1】:
    TOC = []
    GOF = []
    file_name = 'file.txt'
    
    with open(file_name) as f:
        for line in f:
            if(line[0:3] == "TOC"):
                # Splits lines by commas
                line_parts = line.split(',')
                #Trims new line off wanted value.
                value = line_parts[3].replace('\n', '')
                TOC.append(value)
            elif(line[0:3] == "GOF"):
                # Splits lines by commas
                line_parts = line.split(',')
                #Trims new line off wanted value.
                value = line_parts[3].replace('\n', '')
                GOF.append(value)
    
    print(TOC)
    print(GOF)
    

    这是我第一次发帖,希望对你有帮助。这应该会给你你想要的结果。如果您希望将值存储为整数,请将 TOC.append(value) 替换为 TOC.append(int(value))。

    【讨论】:

      【解决方案2】:

      您的解决方案无法正常工作的原因是,获取字符串的索引位置 (line[3]) 会给您一个字符。要从逗号分隔的行中获取整个单词,您需要 split 它,指定逗号作为分隔符。

      Split 返回一个数组或字符串,所以现在当你得到一个索引值时,你会从数组中的那个位置得到一个字符串,而不仅仅是一个字符。

      这是一个替代实现,基于 WebScrapingPancake 的答案,使用列表字典。使用字典意味着您不需要知道该行的第一个“单词”是什么。

      import collections
      
      totals = collections.defaultdict(list)
      file_name = 'file.txt'
      
      with open(file_name) as f:
          for line in f:
              line_parts = line.split(',')
              # Trims new line off wanted value.
              value = line_parts[3].replace('\n', '')
              totals[line_parts[0]].append(value)
      
      print(totals)
      print(totals['TOC'])
      print(totals['GOF'])
      

      输出:

      defaultdict(<class 'list'>, {'ENDI': ['29', '36'], 'TOC': ['3742', '38799'], 'GOF': ['31', '18']})
      ['3742', '38799']
      ['31', '18']
      

      缺点是您必须过滤掉不需要的行,例如文件的第一行。但这是我留给你解决的问题;)

      【讨论】:

        【解决方案3】:

        使用 CSV 阅读器。在其他项目中对你有帮助。

        TOC = []
        GOF = []
        with open('file.txt', newline='') as f:
            reader = csv.reader(f, delimiter=',')
            for line in reader:
                if len(line) == 1: # skip attribute tag
                    continue
                if line[0] == "TOC":
                    TOC.append(int(line[3]))
                if line[0] == "GOF":
                    GOF.append(int(line[3]))
        print("TOC = " + str(TOC))
        print("GOF = " + str(GOF))
        

        输出是:

        TOC = [3742, 38799]
        GOF = [31, 18]
        

        我从您的问题中假设您希望列表中的内容是整数,而不是字符串文字,所以这就是为什么值被包装在 int()s 中。

        【讨论】:

          【解决方案4】:

          你的答案几乎是正确的。您只需要将行拆分为一个列表(基于逗号),这样当您编写 line[3] 时就有意义了:

          TOC = []
          GOF = []
          with open('file.txt') as f:
            for line in f:
              line_list = line.rstrip('\n').split(',')
              if line.startswith("TOC"):
                  TOC.append(line_list[3])
              if line.startswith("GOF"):
                  GOF.append(line_list[3])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-15
            • 2017-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-30
            相关资源
            最近更新 更多