在python

时间:2018-02-14 18:35:24

标签: python file numpy

我的代码生成一个二维数组,我想将其保存到一个文件中。这可以使用numpy.savetxt轻松完成,如示例代码所示。但我希望做些不同的事情。在下面的代码中,我为5个步行者生成随机游走。对于每次步行,我生成助行器的位置一段时间并将位置存储在列表中。每次完成步行后,我将包含walker位置的整个列表添加为已存在的数组S_data的新行。在下一步(或迭代)结束时,我添加下一个步行者的位置列表,依此类推。因此,在每个步行者的迭代结束时,新的行被添加到S_data。在所有遍历结束时,此S_data最终使用numpy.savetxt保存到外部文件。

import numpy as np

no_of_walkers = 5
t_max = 10

S_data=np.zeros(t_max)

for R in range(no_of_walkers):
    position = []
    x = 0.0
    for t in range(t_max):
        x = x + np.random.randint(-1, 2)
        position.append(x)
    S_data = np.vstack([S_data, position])

S_data = np.delete(S_data, obj=0, axis=0)

np.savetxt('data_file.txt', S_data)

我希望做的是,在每次漫步结束时,我不想将位置列表添加到S_data,而是将其写入外部文件。再次在下一次迭代结束时,我将把下一个walker的位置列表添加为外部文件的新行,依此类推。我想这样做是因为,我将不得不为大量步行者运行此代码,并且还需要更长时间,因此我的代码将占用大量RAM,我想避免使用。是否有一种pythonic方法可以在每次迭代结束时将列表导出到同一个外部文件,而不会覆盖以前的数据?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,似乎你试图在每次迭代后附加到一个文件(如果你的数据文件已经存在),如果是这样的话,请使用:

f = open("data_file.txt", "a+")

"a+"表示您希望随后调用write。文档here。如果您正在进行一系列迭代,请确保在任何循环之外打开文件。

当然你也可以在每次迭代后循环编写新行的每个元素,然后用这样的东西写一个换行符:

#open file
for item in newRow:
  #Your formatting will determine the specifics of this write
  f.write(item)
f.write("\n")

这样的事情就像我认为的那样:

# Use with for file safety
with open('output.txt', 'w') as f:    
    for R in range(no_of_walkers):
        x = 0.0
        for t in range(t_max):
            x = x + np.random.randint(-1, 2)
            f.write(str(x) + ' ')
        f.write('\n')

output.txt的

1.0 1.0 1.0 1.0 1.0 0.0 0.0 -1.0 -2.0 -2.0 
0.0 1.0 0.0 0.0 -1.0 0.0 1.0 0.0 1.0 1.0 
-1.0 -1.0 -1.0 -2.0 -1.0 -1.0 -2.0 -1.0 -2.0 -3.0 
-1.0 -1.0 0.0 1.0 0.0 1.0 2.0 1.0 2.0 1.0 
1.0 0.0 -1.0 -2.0 -1.0 -1.0 0.0 1.0 1.0 0.0 

至于效率,我很确定你最初尝试写的方式更好。请参阅此post