实际应用中,对数据进行处理时,到手的数据文件往往五花八门,data、txt、csv、json等等。Python为我们提供了强大的数据分析处理工具,如果文件符合某种格式要求,可以使用pandas模块中的各种read方法直接读取。例如大名鼎鼎的鸢尾花数据集iris.data,使用Notepad++打开文件观察数据,可见:

Python怎么读取dat文件数据并画图 python dat文件读取_分隔符


从图中可以看出,没有表头,字段清晰,分隔符均为逗号,因此可直接使用read_csv方法将数据读取为Dataframe对象,再通过Dataframe对象进行各种操作:

df = pd.read_csv('e:\iris.data',header=None)
# 查看数据前5行
df.head()
# 读取后100个数据的第2和第3列数据作为特征
X = df.iloc[-100:,[2,3]].values
# 读取后100个数据的第4列元素作为数据标签
y = df.iloc[-100:,4].values

如果遇到不这么标准的数据是否能够这样操作?例如这个StoneFlakes.dat:

Python怎么读取dat文件数据并画图 python dat文件读取_分隔符_02


文件中既包含表头又有数据字段,分隔符包括数量不等的空格、逗号以及空格+逗号,如果直接使用read_csv方法读取肯定无法准确的获取数据。解决办法就是直接使用open()方法对文件进行按行读取,再根据文件结构解析数据。如下:

import numpy as np 
import pandas as pd 
from pandas import DataFrame

datalist = []
columnlist = []
with open('e:\data\StoneFlakes.dat','r') as of:
    # 获取第一行表头数据    
    firstline = of.readline()    
    # 删除字符串头尾的特定字符    
    firstline = firstline.strip('\n')    
    # 将字符串按照空格进行分割    
    columnlist = firstline.split()

按照该表格结构,第一行为表头数据,故首先使用open()方法打开文件,返回一个TextIOWrapper对象,使用其中的readline()方法返回一行文本数据,再使用strip()方法删除首尾可能存在的换行符或其他不需要的符号,最后使用split方法按照空格作为分割符将字符串分割为列表,从而获得表格的列名。之后可对数据进行读取。

for line in of:        
    	# 清除前后回车符,按照空格进行分割
    	line = line.strip('\n').split()

由于数据中的分割符较为复杂,包含空格和逗号的各种组合,采取的策略是多次分割。通过对数据观察发现,大部分数据是以逗号作为分隔符,但是少量逗号分割符前面包含空格,同时第1列和第2列之间的分隔符均为数量不等的空格。所以对每一行文本,先以空格为分隔符进行分解,得到数量较少但长度较长的多个字段。同样先试用stripe(’\n’)方法除去首尾的换行符,再使用split()方法按照空格为分割符进行分割。此时得到的列表中的元素即为严格以逗号为分隔符的字符串,如下:

['ar', '?,35.30,2.60,', '?,42.4,24.2,47.1,69']

之后再按照逗号对每个字符串进行分割,最后将得到的多个列表串联,得到了包含该行所有数据元素的列表,如下:

linelist = []        
        for str in line:            
            # 按照‘,’进行分割            
            # 字符串前后可能还有',',需要先清除            
            linelist = linelist + (str.strip(',').split(','))                		
         datalist.append(linelist)

由于有的字段是以逗号结尾,需要先试用strip(’,’)方法去除,再使用split(’,’)方法以逗号为分割符进行分割。得到每一行数据的列表后,通过append方法组合为一个二维的列表,结合之前获取的表头列表,用以构建Dataframe对象。如下

df = DataFrame(datalist, columns=columnlist)
df
ID   LBI    RTI   WDI  FLA   PSF   FSF  ZDF1 PROZD
0    ar     ?  35.30  2.60    ?  42.4  24.2  47.1    69
1   arn  1.23  27.00  3.59  122   0.0  40.0  40.0    30
2    be  1.24  26.50  2.90  121  16.0  20.7  29.7    72
3   bi1  1.07  29.10  3.10  114  44.0   2.6  26.3    68
4   bi2  1.08  43.70  2.40  105  32.6   5.8  10.7    42
..  ...   ...    ...   ...  ...   ...   ...   ...   ...

[79 rows x 9 columns]

此时得到Dataframe对象准确的包含了原始文件中的数据,满足进行下一步的操作要求。