从文件中读取多行列表

时间:2015-02-16 21:15:30

标签: python python-3.x

我有一个包含以下数据的文件:

POTENTIAL
TYPE               1
 -5.19998150116627E+07 -5.09571848744513E+07 -4.99354600752570E+07 -4.89342214499422E+07 -4.79530582388520E+07
 -4.69915679183017E+07 -4.60493560354389E+07 -4.51260360464197E+07 -4.42212291578282E+07 -4.33345641712756E+07
 -4.24656773311163E+07 -4.16142121752159E+07 -4.07798193887125E+07 -3.99621566607090E+07 -3.91608885438409E+07
 -3.83756863166569E+07
 -8.99995987594328E+07 -8.81884626368405E+07 -8.64137733336537E+07 -8.46747974037847E+07 -8.29708161608188E+07
 -8.13011253809965E+07 -7.96650350121689E+07 -7.80618688886128E+07 -7.64909644515842E+07 -7.49516724754953E+07
 -7.34433567996002E+07 -7.19653940650832E+07 -7.05171734574350E+07 -6.90980964540154E+07 -6.77075765766936E+07
 -6.63450391494693E+07 

请注意根据Nsh的评论,这些数据不是单行。它们每行总共有5个数据,根据这个例子,它是4行,第4行只有一个数据。所以,我有16个浮点线超过4线。我总是知道总数(即本例中为16)

我的目标是将它们作为列表阅读(如果有更好的事情,请告诉我)。带有单个条目的行表示列表的结尾(例如,列表[1]以-3.83756863166569E+07结尾)。

我试着把它读作:

    if line.startswith("POTENTIAL"):
        lines = f.readline()
        if lines.startswith("TYPE  "):
            lines=f.readline()
            lines=lines.split()
            lines = [float(i) for i in lines]
            pots.append(lines)
        print(pots)

给出了结果:

[[-51999815.0116627, -50957184.8744513, -49935460.075257, -48934221.4499422, -47953058.238852]]

即。只是列表中的第一行,而不是更进一步。 我的目标是将它们作为不同的列表(可能)作为:

pots[1]=[-5.19998150116627E+07....-3.83756863166569E+07]
pots[2]=[-8.99995987594328E+07....-6.63450391494693E+07]

我已经阅读了广泛搜索的谷歌(目前的状态本身来自另一个SO问题),但由于我的经验不足,我无法解决我的问题。

请帮助。

2 个答案:

答案 0 :(得分:2)

使用+代替append 它会将线条元素附加到花盆中 pots = pots + lines

我在开始时没有看到:
pots = []

在这种情况下需要......

答案 1 :(得分:0)

ITEMS_PER_LIST = 16
lists = [[]] # list of lists with initialized first sublist
with open('data.txt') as f:
    for line in f:
        if line.startswith(("POTENTIAL", "TYPE")):
            continue

        if len(lists[-1]) == ITEMS_PER_LIST:
            lists.append([])  # create new list

        lists[-1].extend([float(i) for i in line.split()])

验证标题需要进一步调整。