将列表或数组写入文件

时间:2012-09-06 06:39:08

标签: python

temp.txt文件的示例:

  

文件:t091110_065921.SFTC Src:J1903 + 0925 Nsub:1 Nch:1 Npol:4 Nbin:1024 RMS:0.00118753
  0 0 0 0.00148099 -0.00143755 0.000931365 -0.00296775
  0 0 1 0.000647476 -0.000896698 0.000171287 0.00218597
  0 0 2 0.000704697 -0.00052846 -0.000603842 -0.000868739
  。
  。
  等等。

谢谢!


为了回应这是如何生成的,我使用了以下代码:

for i in range(numrows):
    epoch_name = y['filename'][i]
    os.system('pdv -t {0} > temp.txt '.format(epoch_name))
    stokes_line = np.genfromtxt('temp.txt', usecols=3, dtype=[('stokesI','float')], skip_header=1)
    stokes_list.append(stokes_line)
stokes_columns = zip(*stokes_list)

因此,每次程序循环(进入文本文件)时,我使用“pdv”命令的其他软件生成一个值网格。然后我从这个文本文件中提取1个特定列并将其添加到“stokes_list”。最后,我将数组转换(或者不管它是什么),以便列成为行。


我在Python中有一个列表(或任何数组,我实际上并不理解术语)的列表,如下所示:

[((1,)(2,)(3,)),((4,)(5,)(6,)),((7,)(8,)(9,))]

首先,我不确定为什么方括号内有圆括号,而不是方括号内的方括号。其次,我不知道为什么数字后面有逗号,而且它们自己出现在括号中。无论如何 - 也许需要更多的背景来回答这个问题。但我真正的问题是,我正在尝试将其写入文件格式:

1   2   3  
4   5   6  
7   8   9  

我在尝试:

with open('final.txt','w') as f:
    for row in stokes_columns:
        f.write('\t'.join(row)+'\n')

其中“stokes_columns”是我顶部的数组/列表的名称。

我收到错误消息:

f.write('\t'.join(row)+'\n')
TypeError: sequence item 0: expected string, numpy.void found

有人可以帮我这个吗?

5 个答案:

答案 0 :(得分:2)

join需要一个字符串数组。你的第3行应该是:

f.write('\t'.join(str(cell) for cell in row)+'\n')

如果你愿意,你可以在一个陈述中完成整个事情:

f.write('\n'.join(
    '\t'.join(str(cell) for cell in row)
    for row in stokes_columns
))

答案 1 :(得分:2)

这不是创建或转置numpy矩阵的方法(特别是因为它不是一个numpy矩阵 - 它是numpy向量的常规列表)。请尝试以下方法:

stokes_list = np.array([])
for i in range(numrows):
    epoch_name = y['filename'][i]
    os.system('pdv -t {0} > temp.txt '.format(epoch_name))
    stokes_line = np.genfromtxt('temp.txt', usecols=3, dtype=[('stokesI','float')], skip_header=1)
    stokes_list = vstack(stokes_list, stokes_line)

stokes_columns = np.transpose(stokes_list)

答案 2 :(得分:2)

而不是您指定的列表(我认为它不应该是它)

假设它是[((1,),(2,),(3,)),((4,),(5,),(6,)),((7,),(8,),(9,))]

以下内容应该在某种程度上帮助您

获得最终输出后,可以使用它将其推送到行

In [74]: str = [((1,),(2,),(3,)),((4,),(5,),(6,)),((7,),(8,),(9,))]

In [75]: str2 = []

In [76]: for elem in str:
   ....:     str2.append([data[0] for data in elem])
   ....:

In [77]: str2
Out[77]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [78]: for elem in zip(*str2):
   ....:     print elem
   ....:
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)

根据OP的上次编辑,更改了输出:

In [92]: for elem in str2:
   ....:     print elem
   ....:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

答案 3 :(得分:2)

你没有尝试拖写一个元组列表,而是一个具有灵活数据类型的numpy数组(在这种情况下为void,相应于你的TypeError)。灵活的dtypes没有预定义的大小,因此在保存之前,您应该决定要用于存储阵列的dtype。例如,假设您希望将数据存储为int16,则可以执行以下操作:

your_array.astype('int16').tofile(filename)

我认为它应该有用。

答案 4 :(得分:0)

tofile()函数将所有项(作为机器值)写入文件对象f。 也许savetxt()是am ascii-file

的正确功能