Python从文本文件中读取数字块(由单行文本分隔)为Numpy数组或Pandas DataFrame

时间:2015-04-22 00:50:25

标签: python numpy pandas

我有以下2个文本文件,它们包含由文本行分隔的数字块。我试图将块读入Pandas数据帧或Numpy数组。以下是文件:

FILE1.TXT:

Line one text
Line two text
Line three text
Temperature Readings:  1   5   abcd
 17 7.7
 18 1.9
 19 14.6
 11 7.1
  4 2.4
Temperature Readings:  2   3   ddef
 26 4.2
 45 12.0
  2 9.3
Air-Pressure was taken:   17.0  474.0

Top Total
11    317
14     34

FILE2.TXT:

Line one text
Line two text
Line three text
Temperature Readings:  1   3   fnlksn
 11 8.9
 35 2.6
 41 1.7
 14 3.3
  8 11.5
Temperature Readings:  2   7   vsfgfs
 16 26.7
 91 10.5
 12 11.3
Temperature Readings:  3   4   tomt_2
 11 11.2
 78 2.8
 56 1.5
Air-Pressure was taken:   17.0  474.0

Top Total
74     31
99     14
83     04
 9     10

我正在寻找一种方法来读取这两个文件。问题是在第一个文件中,只有2个温度读数块。第二个文件具有不同数量的块 - 在本例中它是3,但它可以是任何数字。

这就是导致我出现问题的原因:

  • 我想阅读每个方块标题下面的数字。我会 喜欢将这些数字读入一个numpy数组或pandas数据帧。
  • 我遇到的第二个问题是我不知道如何阅读 数字sinec他们有一个领先的空白 - 这就是它 很难将它们分开。

以下是我想要的内容:

来自File1.txt: t_1 =

   0    1
0 17  7.7
1 18  1.9
3 19 14.6
4  4  2.4

t_2 =

   0    1
0 26  4.2
1 45 12.0
2  2  9.3

来自File2.txt: t_1 =

   0    1
0 11  8.9
1 35  2.6
2 41  1.7
3 14  3.3
4  8 11.5

t_2 =

   0    1
0 16 26.7
1 91 10.5
2 12 11.3

t_3 =

   0    1
0 11 11.2
1 78  2.8
2 56  1.5

有没有办法在Python 2.7中执行此操作?

编辑:包括Air-Pressure及以下在内的行可以忽略。

1 个答案:

答案 0 :(得分:3)

不确定您是否可以在pandas中完成所有操作,但您可以使用groupbyitertools.islice来跳过并对这些行进行分组:

from itertools import groupby,islice
import pandas as pd

with open("file2.txt") as f:
    for k, v in groupby(islice(f, 3, None),key=lambda x:  x.strip()[0:1].isdigit()):
        val = list(v)
        if k:
            df = pd.DataFrame(map(str.split,val))
            print(df)
            print(""))
        elif val[-1] == 'Top Total\n':
            break

    0     1
0  11   8.9
1  35   2.6
2  41   1.7
3  14   3.3
4   8  11.5

    0     1
0  16  26.7
1  91  10.5
2  12  11.3

    0     1
0  11  11.2
1  78   2.8
2  56   1.5

它们实际上都是不同的数据名称,您存储它们的方式取决于您:

data_frames = []
with open("file2.txt") as f:
        for k, v in groupby(islice(f, 3, None),key=lambda x:  x.strip()[0:1].isdigit()):
            val = list(v)
            if k:
                data_frames.append(pd.DataFrame(map(str.split,val)))
            elif val[-1] == 'Top Total\n':
                break
print(data_frames) # three dataframes in a list