【问题标题】:How to print several array elements per line to text file如何将每行的多个数组元素打印到文本文件
【发布时间】:2013-02-03 05:04:23
【问题描述】:

我有一个一维数组,例如arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...] 任意长度。

如何将其打印到文本文件(整数/浮点数由空格分隔),以便每 7 个元素打印在文本文件的同一行上?

所以我希望文本文件看起来像这样:

第一行:1 2 3 4 5 6 7

第 2 行:8 9 10 11 12 13 14

【问题讨论】:

    标签: python list output text-files


    【解决方案1】:

    您的问题可以分为三个部分:

    1. 如何将任意大小的列表分成特定长度的块
    2. 如何使用空格作为分隔符打印整数/浮点数列表
    3. 如何写入文件

    将任意大小的列表分成特定长度的块

    使用this answer中描述的grouper方法:

    import itertools
    
    def grouper(n, iterable):
        it = iter(iterable)
        while True:
           chunk = tuple(itertools.islice(it, n))
           if not chunk:
               return
           yield chunk
    

    您可以轻松地将任意长度的列表拆分为所需长度的块。例如:

    >>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
    >>> for chunk in grouper(7, arr1): print chunk
    ... 
    (1, 2, 3, 4, 5, 6, 7)
    (8, 9, 10, 11, 12, 13, 14)
    (15, 16)
    

    使用空格作为分隔符打印整数/浮点数列表

    将列表加入字符串的标准方法是使用string.join()。但是,这仅适用于字符串列表,因此我们需要首先将每个元素转换为其字符串表示形式。这是一种方法:

    >>> a = [1, 2, 3, 4]
    >>> print " ".join(str(x) for x in a)
    1 2 3 4
    

    使用前面例子中的这个方法,我们得到:

    >>> for chunk in grouper(7, arr1):
    ...   print " ".join(str(x) for x in chunk)
    ... 
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16
    

    这几乎就是您想要的输出。现在我们需要做的就是将其写入文件。

    写入文件

    with open("outfile.txt", "w") as f:
      for chunk in grouper(7, arr1):
        f.write(" ".join(str(x) for x in chunk) + "\n")
    

    详情请见Reading and Writing Files

    【讨论】:

      【解决方案2】:

      你可以这样做:

      liNums = xrange(1, 20)
      x = 0
      line = ""
      for i in liNums:
          x+=1
          line += "%s " % i
          if not x%7:
              line += "\n"
      #send line to output, here I will just print it
      print line
      

      这里每 7 项添加一个新行...输出如下所示:

      1 2 3 4 5 6 7 
      8 9 10 11 12 13 14 
      15 16 17 18 19 
      

      希望有帮助!

      【讨论】:

      • 你有一个很好的算法(我也有!)。使用生成器和enumerate(),您将拥有 Python 精神
      • 我明白你的意思,当我回答这个问题时,让行而不是仅仅附加 \n 我写下了这个问题会突然出现在我脑海中的第一件事:p
      【解决方案3】:
      >>> [arr1[7 * i: 7 * i + 7] for i in range(0, 1 + len(arr1) / 7)]
      [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15]]
      

      然后你只需要迭代这个列表(列表),将它们插入到文件中。

      【讨论】:

      • 将其作为生成器表达式而不是列表理解可能会更好。
      • 如果len(arr1)%7 == 0,我认为这不会满足您的要求。试试(6+len(arr1))/7
      • 是的:如果arr1 = [1, 2, 3, 4, 5],它会给出[[1, 2, 3, 4, 5]]。还是我误会了你?
      【解决方案4】:
      >>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
      >>> for i in xrange(0,len(arr1),7):
      ...     print arr1[i:i+7]
      ... 
      [1, 2, 3, 4, 5, 6, 7]
      [8, 9, 10, 11, 12, 13, 14]
      

      或者你可以这样做:

      >>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
      >>> results = map(str,arr1)
      >>> for i in range(0,len(arr1),7):
      ...     ','.join(results[i:i+7])
      ... 
      '1,2,3,4,5,6,7'
      '8,9,10,11,12,13,14'
      

      【讨论】:

      • 可靠简单,胜过重型机械。你可以通过'\n'.join(','.join(results[i:i+7]) for i in range(0,len(arr1),7))提高写作速度。
      【解决方案5】:

      您可以使用 zip 成语对序列进行分块:

      from itertools import izip
      
      def chunk(seq, n):
          return izip(*[iter(seq)]*n)
      

      然后您可以为writelines 编写一个迭代器:

      def chunkedlines(seq, n):
          for line in chunk(seq, 7):
              yield ' '.join(str(item) for item in line)
              yield "\n"
      

      终于用上了:

      from StringIO import StringIO
      fp = StringIO('wb')
      
      arr1 = range(1, 15)
      
      fp.writelines(chunkedlines(arr1, 7))
      
      print fp.getvalue()
      

      【讨论】:

      • izip(*[iter(seq)]*n) 呼!!我不知道它是否很快,但它很棘手!它之所以有效,是因为 [iter(seq)]*n 创建了一个长度为 n 的列表,其中所有元素都等于同一个迭代器。
      【解决方案6】:
      output=''
      col = 0
      for i in arr1:
          output +="%s " % i #write an element of the array to the output and append a space
          col += 1 #count the number of elements on the current line
          if col==7: #if 7 elements have been entered, append a new line and restart the count
              output += "\n"
              col = 0
      
      f = open("filepath.txt",'w') #open a file (replace filepath.txt with the actual filename)
      f.write(output) # write the output to the text file
      f.close() #close the file object
      

      【讨论】:

        【解决方案7】:

        在 Python 中,想想“生成器”!

        li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,101,
              203,514,201,567,849]
        
        gen = ('%-5s\n' % x if i%7==0 else '%-5s' %x
               for i,x in enumerate(li,1))
        
        print ''.join(gen)
        

        结果

        1    2    3    4    5    6    7    
        8    9    10   11   12   13   14   
        101  203  514  201  567  849 
        

        如果你想参数化每行的数字数量,创建一个生成器函数:

        def yn(li,n):
            for i,x in enumerate(li,1):
                yield '%-5s ' % x
                if i%n==0:
                    yield '\n'
        
        print ''.join(yn(li,7))
        

        【讨论】:

          【解决方案8】:
          from itertools import imap
          print '\n'.join((' '.join(imap(str, arr1[i*7:(i+1)*7])) for i in xrange((6+len(arr1))/7)))
          

          或者,

           groups_of_seven = (arr1[i*7:(i+1)*7] for i in xrange((6+len(arr1))/7))
           groups_of_seven_strings = (imap(str, i) for i in groups_of_seven)
           groups_of_strings = (' '.join(i) for i in groups_of_seven_strings)
           one_string = '\n'.join(groups_of_strings)
          

          将嵌套的joins 与izip 技术相结合:

          print '\n'.join((' '.join(j) for j in izip(*[imap(str, arr1)]*7)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-05
            • 2015-01-28
            • 2013-11-16
            • 1970-01-01
            • 2017-03-04
            相关资源
            最近更新 更多