【问题标题】:Python - read numbers from text file and put into listPython - 从文本文件中读取数字并放入列表
【发布时间】:2012-09-04 21:19:15
【问题描述】:

就像标题所说的那样,我开始学习一些 python 并且我无法掌握这种技术。我需要完成的是读取一些数字并将它们存储在一个列表中。文本文件如下所示:

0 0 3 50

50 100 4 20

基本上这些是用于 python 的海龟制作形状的坐标和方向。我把那部分记下来了,唯一的问题是让它们以正确的格式出现。所以我不知道如何将这些数字从文件中获取到[ [0, 0, 3, 50], [50, 100, 4, 20] ] 一个列表,每四个坐标是那个大列表中的一个列表。

这是我的尝试,但正如我所说,我需要一些帮助 - 谢谢。

polyShape=[]
infile = open(name,"r")
num = int(infile.readline(2))
while num != "":
    polyShape.append(num)
    num = int(infile.readline(2))
infile.close()

【问题讨论】:

    标签: python


    【解决方案1】:
    with open('data.txt') as f:
        polyShape = []
        for line in f:
            line = line.split() # to deal with blank 
            if line:            # lines (ie skip them)
                line = [int(i) for i in line]
                polyShape.append(line)
    

    会给你

    [[0, 0, 3, 50], [50, 100, 4, 20]]
    

    这适用于包含空行(或不包含)的文件。

    使用with 构造将在您完成或遇到异常时自动为您关闭文件。

    【讨论】:

    • 非常感谢您的快速帮助!
    【解决方案2】:

    假设您的输入文件中实际上没有空行:

    with open(name, "r") as infile:
        polyShape = [map(int, line.split()) for line in infile]
    

    解释:map(int, line.split()) 拆分每个 line 并将每个部分转换为 int[X for Y in Z] 构造是一个列表推导式,它依次将 map 映射到文件的所有行,并在列表中返回其结果。

    如果您现在觉得这太复杂了,那么 map(int, line.split()) 是主要的带回家的信息。

    【讨论】:

    • map(int, line.split()) 就像 Python 的诗歌。它甚至押韵。
    • map() 不起作用,它没有被执行。结果是:[, , ]。有效的解决方案是 Levon 的
    【解决方案3】:
    with open('data.txt') as f:
        lis=[map(int,x.split()) for x in f if x.strip()]   # if x.strip() to skip blank lines
    
       #use list(map(int,x.split()))  in case of python 3.x
    

    map() 是这样工作的:

    >>> map(int,'1 2 3 4'.split())
    [1, 2, 3, 4]
    

    【讨论】:

      【解决方案4】:

      单线:

      [ [int(x) for x in line.split(' ')] for line in open(name,'r').readlines() if line.strip()]
      

      readlines 部分可能不是一个好主意。

      我很确定 [int(x) for x in ... ] 比在其他建议的解决方案中使用 map 更快。

      编辑

      感谢 Blender:不需要.readlines,这很酷,所以我们只需要:

      [ map(int, line.split()) for line in open(name,'r') if line.strip()]
      

      我还使用了map(int, ),因为它实际上更快,而且您可以只使用line.split() 而不是line.split(' ')

      【讨论】:

      • 另外,map 比我的列表理解快 15 倍左右。尝试计时。
      • 流线型和非常 Pythonic
      【解决方案5】:

      遍历文件是最简单的方法:

      poly_shape = []
      
      with open(name, 'r') as handle:
          for line in handle:
              if not line.strip():
                  continue  # This skips blank lines
      
              values = map(int, line.split())
              poly_shape.append(values)
      

      【讨论】:

      • 为什么是line.split(' ') 而不是line.split()
      • 我喜欢冗长。 line.split() 并没有明确告诉你你在分裂什么。
      • .. 但现在不能有两个空格或代码中断。我想我更喜欢.split() 的行为,但是YMMV。
      • @Blender:line.split()line.split(' ') 不同。它也可以处理多个空格和制表符。
      • @larsmans:谢谢,我不知道。我认为' ' 是默认参数。固定。
      【解决方案6】:

      我不建议将append 用于大数组。它比创建零数组并为其赋值要慢 50 倍。

      import numpy
      fname = "D:\Test.txt";
      num_lines = sum(1 for line in open(fname));
      array = numpy.zeros((num_lines,4));
      k = 0;
      with open(fname, "r") as ins:
          for line in ins:
              a =[int(i) for i in line.split(' ')];;
               array[k,0:4] =a;
               k = k+1;
      print(array)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        • 2011-10-28
        • 2013-12-08
        • 2012-06-22
        • 2020-06-01
        • 1970-01-01
        相关资源
        最近更新 更多