使用Python读写固定格式(MODFLOW)文本文件

时间:2015-02-24 01:55:22

标签: python csv text matrix pandas

我正在尝试使用python读取,操作和编写文本文件。这些文件包含数字矩阵,并且是从名为MODFLOW的FORTRAN地下水流程代码生成的,并且具有不寻常的形状,因为矩阵行分布在多个文件行中,因此每行不超过7个值。因此,输出具有37列的矩阵行作为5行7个值(fmt ='%14.6E'),接着是1行,具有2个值。然后下一个矩阵行从一个新行开始。

我正在尝试读取两个这样的文件,每个文件有730个时间步长x 49行x 37列(约18 Mb)。然后我想将元素乘以元素并将结果写入具有相同格式的新文件中。

我可以使用csv.reader逐行执行,然后使用numpy.savetext,但速度非常慢。我怎么能用更快的numpy(或类似)来做呢?谢谢!

更新:

我几乎就在那里,只需要摆脱输出文件中的逗号。显然这对熊猫来说目前是不可能的,所以我可能不得不做一个单独的操作。

解决:

获取pandas输出作为文本并使用replace()来删除分隔符。还是很快。

import pandas as pd

root = 'Taupo'

rctrans = read_csv(root+'._rctrans', header=None, delim_whitespace=True)
rcmult = read_csv(root+'._rcmult', header=None, delim_whitespace=True)

# duplicate rcmult nsteps times to make it the same size as rctrans
nsteps = len(rctrans.index)/len(rcmult.index)    
rcmult = pd.concat([rcmult]*nsteps, ignore_index=True)

# multiply the arrays
rctrans = pd.DataFrame(rctrans.values*rcmult.values, columns=rctrans.columns, index=rctrans.index)

# write as csv with no delimiter
with open(root+'._rc','w') as w:
    w.write(rctrans.to_csv(header=False, index=False, float_format='%14.6E').replace(',',''))

1 个答案:

答案 0 :(得分:0)

我认为任何逐行处理文件的基于Python的文件阅读器都会有类似的速度。据说熊猫有一个更快的CSV阅读器,但我不熟悉它。你对代码慢的地方有什么看法吗?读文件?解析?收集列表/数组中的值?

首先,我尝试编写一个读取6行的读取器,将它们拼接在一起,以便在一行中获得37个数字。然后解析它并转换为37个浮点数列表。最后将其附加到主列表中。

一旦我完成其中的49个,创建一个(49,37)数组,然后将其保存或附加到另一个包含所有时间步骤的列表中。

正如其他有关np.genfromtxtnp.loadtxt的SO问题所述,它们接受任何迭代器(或生成器)。因此,函数的输入可以是这个聚合器,它将6行转换为37行的一行。

在不了解您当前方法的更多细节的情况下,我不能说我的建议是否更快。没有类似的测试文件,我真的无法测试替代品。所以在一个层面或其他层面上,这都是推测性的。