我有一个.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。我不知道如何最好地做到这一点。
答案 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]
。