【问题标题】:How to separate different input formats from the same text file with Python如何使用 Python 从同一个文本文件中分离不同的输入格式
【发布时间】:2019-02-08 03:07:19
【问题描述】:

我是编程和 python 的新手,我正在寻找一种方法来区分同一输入文件文本文件中的两种输入格式。例如,假设我有一个像这样的输入文件,其中值以逗号分隔:

5
华盛顿,A,10
纽约,B,20
西雅图,C,30
波士顿,B,20
亚特兰大,D,50
2
纽约,5
波士顿,10

格式为N后跟N行Data1,M后跟M行数据2。我尝试打开文件,逐行读取并将其存储到一个列表中,但我不确定如何为 Data1 和 Data2 生成 2 个列表,这样我会得到:

Data1 = ["Washington,A,10", "New York,B,20", "Seattle,C,30", "Boston,B,20", "Atlanta,D,50"]
Data2 = [“纽约,5”,“波士顿,10”]

我最初的想法是遍历列表,直到找到一个整数 i,然后从列表中删除整数并继续下一个 i 迭代,同时存储随后的值在一个单独的列表中,直到我找到下一个整数然后重复。但是,这会破坏我的初始列表。有没有更好的方法来分隔不同列表中的两种数据格式?

【问题讨论】:

    标签: python input text


    【解决方案1】:

    您可以使用itertools.islice 和列表理解:

    from itertools import islice
    
    string = """
    5
    Washington,A,10
    New York,B,20
    Seattle,C,30
    Boston,B,20
    Atlanta,D,50
    2
    New York,5
    Boston,10
    """
    
    result = [[x for x in islice(parts, idx + 1, idx + 1 + int(line))]
              for parts in [string.split("\n")]
              for idx, line in enumerate(parts)
              if line.isdigit()]
    
    print(result)
    

    这会产生

    [['Washington,A,10', 'New York,B,20', 'Seattle,C,30', 'Boston,B,20', 'Atlanta,D,50'], ['New York,5', 'Boston,10']]
    

    对于一个文件,您需要将其更改为:

    with open("testfile.txt", "r") as f:
        result = [[x for x in islice(parts, idx + 1, idx + 1 + int(line))]
                  for parts in [f.read().split("\n")]
                  for idx, line in enumerate(parts)
                  if line.isdigit()]
    
    print(result)
    

    【讨论】:

      【解决方案2】:

      您绝对是在正确的轨道上。 如果要在此处保留原始列表,实际上不必删除整数 i;你可以继续下一项。

      代码:

      originalData = []
      formattedData = []
      
      with open("data.txt", "r") as f :
          f = list(f)
          originalData = f
          i = 0
          while i < len(f): # Iterate through every line
              try:
                  n = int(f[i]) # See if line can be cast to an integer
                  originalData[i] = n # Change string to int in original
                  formattedData.append([])
                  for j in range(n):
                      i += 1
                      item = f[i].replace('\n', '')
                      originalData[i] = item # Remove newline char in original
                      formattedData[-1].append(item)
              except ValueError:
                  print("File has incorrect format")
              i += 1
      
      print(originalData)
      print(formattedData)
      

      【讨论】:

        【解决方案3】:

        以下代码将生成一个列表results,它等于[Data1, Data2]

        代码假定指定的条目数正是存在的数量。这意味着对于这样的文件,它不会起作用。

        2
        纽约,5
        波士顿,10
        西雅图,30

        代码:

        # get the data from the text file
        with open('filename.txt', 'r') as file:
            lines = file.read().splitlines()
        
        results = []
        index = 0
        
        while index < len(lines):
            # Find the start and end values.
            start = index + 1
            end = start + int(lines[index])
        
            # Everything from the start up to and excluding the end index gets added
            results.append(lines[start:end])
        
            # Update the index
            index = end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-27
          • 1970-01-01
          • 2012-06-01
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 2020-09-17
          相关资源
          最近更新 更多