【问题标题】:How can I consolidate lines in a text file?如何合并文本文件中的行?
【发布时间】:2019-03-25 15:58:28
【问题描述】:

我有一个如下所示的文本文件:

100 Spam
250 Spam
50  Spam
20  Eggs
70  Eggs

现在我想将这些行合并到一个新文件中,如下所示:

300 Spam
90  Eggs

我将文件逐行读取到列表中。现在我像这样遍历列表中的每个项目:

new_list = []
j = 1
for i in range(len(old_list)):
       new_list.append("")
       if old_list[i][4:] == old_list[i-j][4:]:
          new_list[i-j][:4] = str(int(old_list[i][:4].strip()) + int(old_list[i-j][:4].strip())).ljust(4)
          new_list[i-j][4:] = old_list[i-j][4:]
          j += 1
       else:
          new_list[i-j] = old_list[i-j]

我遇到了两个问题:

  1. 我收到一个类型错误,说我无法分配给字符串
  2. 即使没有错误,当要添加的行超过 2 行时,我也不会得到正确的总和,因为在循环中我会覆盖总和。我需要以某种方式存储这个总和,但我想不出一种优雅的方式来做到这一点。

我是编程新手,所以也许有更好的方法来解决所有问题?

【问题讨论】:

    标签: python-3.x text


    【解决方案1】:
    result = {}
    
    with open("your_file.txt") as infile:
        for line in infile:
            amount, food_item = line.split()
            result[food_item] = result.get(food_item, 0) + int(amount)
    
    print(result)  # {'Spam': 400, 'Eggs': 90}
    

    然后您可以将result 写入新文件

    with open("some_other_file.txt") as outfile:
        for food_item, amount in result.items():
            outfile.write(f"{amount} {food_item}\n")
    

    【讨论】:

      【解决方案2】:

      此解决方案仅限于您提供的输入。 作为第一种天真的方法,我将问题分为 3 个部分:

      1. 将输入解析为元组列表。 读取输入并创建old_list,其中每个元素都是一个元组(值、键)
      old_list = [(100, 'Spam'), (250, 'Spam'), (50, 'Spam'), (20, 'Eggs'), (70,'Eggs')]
      
      1. 遍历旧列表并创建一个字典来累积结果
      result = {}
          for elem in old_list:
              if elem[1] in result:
                  result[elem[1]] += elem[0]
              else:
                  result[elem[1]] = elem[0]
      

      对于old_list 中的每个元素,如果您已经看到具有相同键的项目,请总结其值并继续。否则,将键添加到具有当前值的结果字典中。

      1. 检查结果字典并写下文件。
      result = {'Spam': 400, 'Eggs': 90}
      

      祝你好运!

      【讨论】:

        【解决方案3】:

        试试这个:

        file = open("file.txt", "w+")
        input = file.read().split("\n")
        
        output = {}
        for line in input:
            line = line.split(" ")
            if line[1] in output:
                output[line[1]] += int(line[0])
            else:
                output[line[1]] = int(line[0])
        
        for line in output:
            file.write(line + " " + str(output[line]) + "\n")
        

        【讨论】:

          猜你喜欢
          • 2021-10-03
          • 1970-01-01
          • 2015-12-01
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多