2015-04-22 45 views
1

我有以下2个文本文件,它们包含由文本行分隔的数字块。我正在尝试将块读入Pandas数据框或Numpy数组中。以下是文件:Python将文本文件中的数字块(用单行文本分隔)读入Numpy数组或Pandas DataFrame

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数组或熊猫数据框。
  • 我遇到的第二个问题是我不知道如何阅读 数字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及以下的行可以忽略。

+0

查看字符串方法'strip()'和'split()'。 – TigerhawkT3

回答

3

不知道如果你能做到这一切在大熊猫或没有,但你可以使用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 

他们都实际上是不同的datafames,他们如何存储高达给你:

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 
+0

嗨,对不起,我感到困惑。我不得不编辑原始帖子。现在完成了。基本上,在每个文件的最后一个数字块的末尾,有一行,后面跟着一个空行和一些下面的数字< - 这一切都需要忽略。再次,遗憾的是没有包含在OP中。考虑到这一点,是否有可能说'.startswith(“气压| | Top”)'? –

+0

@WR。是否在相关数据中包含数字的行? –

+0

@WR,尝试编辑 –