如何使用空格分隔符从.txt文件中读取数据?

时间:2016-04-13 12:26:08

标签: numpy pandas dataframe

您好我在文件中有每日数据,而每日数据按月按列排列。一开始就有一些文件信息。数据看起来像:

Day     Jan.   Feb.   Mar.   Apr.   May    Jun.   Jul.   Aug.   Sep.   Oct.   Nov.   Dec.   Year
 01     15.2   12.3   9.96   10.1   15.0   33.7    137    309    182   62.6   27.4   17.2
 02     14.9   12.3   9.96   9.96   16.4   38.2    109    342    197   69.9   25.4   16.6
 03     14.9   12.3   9.78   10.3   17.3   50.3    118    472    184   68.7   24.5   17.0
 04     14.6   12.3   9.69   10.3   18.7   58.1    152    275    190   68.7   24.5   16.6
 05     14.4   12.3   9.51   10.1   18.9   44.5    165    188    206   69.9   24.0   16.5
 06     14.1   12.3   9.41   10.3   19.8   44.8    142    157    192   62.2   23.8   16.1
 07     14.0   12.3   9.32   10.3   20.4   52.6    121    146    182   58.9   24.9   15.6

我用这段代码来读取数据

data ='AQ404.7_01.txt'
with open(data) as fo:
    data = fo.readlines()[9:41]
    df = data[1:32]
    df = [d.strip() for d in df]
    df = (np.array(df))
    column = data[0][:-6]
    for string in (df):
        df = string.split()
        print df

但问题是,当我检查2月的数据时,它提供了31个数据。我试图解决但无法做到。

任何人都可以帮忙解决这个问题吗? 我还附上了数据文件。 https://drive.google.com/file/d/0B2rkXkOkG7ExTlJ3VnExUHFZUzA/view?usp=sharing

2 个答案:

答案 0 :(得分:2)

你应该使用大熊猫的Fixed Width File读者:

因此,对于输入文件,您已定义固定宽度列表:

#Define the column widths    
ws = [4,9,7,7,7,7,7,7,7,7,7,7,7]

#read the file having the header row in the 9th line and read only 31 lines after that
df = pd.read_fwf('AQ404.7_01.txt',widths=ws,header=9, nrows=31)

print df

enter image description here

答案 1 :(得分:1)

我将您的示例复制粘贴到我的case $git_remote_status in behind) #git pull and stuff.... ;; up-to-date | ahead) # echo "nothing to do"... ;; *) echo "unexpected output, please see 'git status -uno'" ;; esac 会话中作为多行文字并运行以下ipython

genfromtxt

我必须指定In [281]: np.genfromtxt(txt.splitlines(),dtype=None,names=True,usecols=range(13)) Out[281]: array([(1, 15.2, 12.3, 9.96, 10.1, 15.0, 33.7, 137, 309, 182, 62.6, 27.4, 17.2), (2, 14.9, 12.3, 9.96, 9.96, 16.4, 38.2, 109, 342, 197, 69.9, 25.4, 16.6), (3, 14.9, 12.3, 9.78, 10.3, 17.3, 50.3, 118, 472, 184, 68.7, 24.5, 17.0), (4, 14.6, 12.3, 9.69, 10.3, 18.7, 58.1, 152, 275, 190, 68.7, 24.5, 16.6), (5, 14.4, 12.3, 9.51, 10.1, 18.9, 44.5, 165, 188, 206, 69.9, 24.0, 16.5), (6, 14.1, 12.3, 9.41, 10.3, 19.8, 44.8, 142, 157, 192, 62.2, 23.8, 16.1), (7, 14.0, 12.3, 9.32, 10.3, 20.4, 52.6, 121, 146, 182, 58.9, 24.9, 15.6)], dtype=[('Day', '<i4'), ('Jan', '<f8'), ('Feb', '<f8'), ('Mar', '<f8'), ('Apr', '<f8'), ('May', '<f8'), ('Jun', '<f8'), ('Jul', '<i4'), ('Aug', '<i4'), ('Sep', '<i4'), ('Oct', '<f8'), ('Nov', '<f8'), ('Dec', '<f8')]) ,因为标题中有14个名称,但数据行中只有13个字段。

请注意,它加载了1d结构化数组。通过字段名称访问列,例如usecols,而不是数字。 data['Jan']将来自第二个数据线的数据。

如果我跳过标题行,我可以将它作为2d浮点数组加载

data[1]

在scatch工作时,我可以将这些行转换为列表:

In [284]: np.genfromtxt(txt.splitlines(),dtype=float,skip_header=1)
Out[284]: 
array([[   1.  ,   15.2 ,   12.3 ,    9.96,   10.1 ,   15.  ,   33.7 ,
         137.  ,  309.  ,  182.  ,   62.6 ,   27.4 ,   17.2 ],
       [   2.  ,   14.9 ,   12.3 ,    9.96,    9.96,   16.4 ,   38.2 ,
         109.  ,  342.  ,  197.  ,   69.9 ,   25.4 ,   16.6 ],
       [   3.  ,   14.9 ,   12.3 ,    9.78,   10.3 ,   17.3 ,   50.3 ,
         118.  ,  472.  ,  184.  ,   68.7 ,   24.5 ,   17.  ],
       [   4.  ,   14.6 ,   12.3 ,    9.69,   10.3 ,   18.7 ,   58.1 ,
         152.  ,  275.  ,  190.  ,   68.7 ,   24.5 ,   16.6 ],
       [   5.  ,   14.4 ,   12.3 ,    9.51,   10.1 ,   18.9 ,   44.5 ,
         165.  ,  188.  ,  206.  ,   69.9 ,   24.  ,   16.5 ],
       [   6.  ,   14.1 ,   12.3 ,    9.41,   10.3 ,   19.8 ,   44.8 ,
         142.  ,  157.  ,  192.  ,   62.2 ,   23.8 ,   16.1 ],
       [   7.  ,   14.  ,   12.3 ,    9.32,   10.3 ,   20.4 ,   52.6 ,
         121.  ,  146.  ,  182.  ,   58.9 ,   24.9 ,   15.6 ]])

我可以获得一个浮动列表列表:

ll = []
for line in txt.splitlines():
    ll.append(line.strip().split())

可以用

转换成2d数组
for line in txt.splitlines()[1:]:   # skip the header
    ll.append([float(i) for i in line.strip().split()])

如果空格分隔符不起作用,np.array(ll) 也接受字段宽度列表作为“分隔符”。查看其文档或实验。