使用字符串导入.dat列列表以形成多个数组

时间:2017-07-21 10:32:51

标签: python arrays string

我有一个.dat文件的文件,每个文件标题为" Dk_LCDM_z"每个都有一个对应于z值的后缀,如我的代码所示。这些文件中的每一个都有3列,我想导入每一列。

换句话说,对于z的每个值,我想导入一个50(?)x3矩阵,每个矩阵来自不同的.dat文件。

我没有丰富的Python经验,并且已经尝试过使用np.genfromtxt和importlib都无济于事。

z  = [0,0.25,0.5,0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25,3.5,3.75,4]

对于缺少代码感到抱歉,因为我已经删除/覆盖了我尝试解决方案的旧版本。

.dat文件我看起来像这样,但是还有更多的行。

0.100000E-03    0.248466E-10    0.248466E-10
0.102016E-03    0.268944E-10    0.268944E-10
0.104072E-03    0.291109E-10    0.291109E-10
0.106170E-03    0.315101E-10    0.315101E-10
0.108311E-03    0.341071E-10    0.341071E-10
0.110494E-03    0.369181E-10    0.369180E-10
0.112721E-03    0.399607E-10    0.399607E-10
0.114994E-03    0.432540E-10    0.432540E-10
0.117312E-03    0.468188E-10    0.468188E-10

我希望能够独立地调用第二列和第三列中的值,因为它们分别依赖于第一列和z。我不知道如何最好地做到这一点。

1 个答案:

答案 0 :(得分:0)

要加载您需要迭代z列表所需的数据,请从每个值生成文件名,然后获取这些文件'内容相当直接。真正的踢球者是您之后想要处理的数据,因为依赖于实际数据解析/加载可能会有很大差异。

由于您尚未指定用例,因此您可以在此处制定通用解决方案:

z = [0, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4]

data_map = {}  # we'll use a dictionary to store our data for fast lookups
for e in z:  # loop through all elements of z
    with open("Dk_LCDM_{}.dat".format(e), "r") as f:  # open each file
        # iterate over each line, split on whitespace and convert each entry to Python float
        data_map[e] = [[float(x) for x in line.split()] for line in f]

然后,您可以访问与您的第四个z元素(例如Dk_LCDM_0.75.dat)对应的文件的第三行的第二个值:data_map[z[3]][2][1]或字面上的data_map[0.75][2][1]

编辑 - 您可以通过解析以下文件将生成的行列表转换为列列表:

data_map[e] = [col for col in zip(*[[float(x) for x in line.split()] for line in f])]

然后,您可以访问第二个文件的第三列的第四行:data_map[0.25][2][3],您可以将第三个文件的第二列全部显示为:data_map[0.5][1]