python中常见csv文件读取方法比较

示例数据集:UCI的电离层(Ionosphere)

要实现的数据集的读取功能:
该数据集共有351行,每行有35个值,前34个为我们要的数据集,最后一个值是’g’或者’b’,表示数据的好坏,我们的任务就是在这个文本数据的前34列分出来,得到我们要的数据data_set(数组类型,元素为float),最后一列分出来,作为我们的标签data_label(布尔数组类型)
实现这个功能有以下几种方法

方法一: open函数

代码如下:

data_file='ionosphere.data'
data_set=np.zeros((351,34),dtype='float')
data_label=np.zeros((351,),dtype='bool')
fr=open(data_file)
array_of_line=fr.readlines()#得到文本的数据数组
number_of_line=len(array_of_line)#得到文本行数
for line in array_of_line:
    list_from_line=line.split(',')
    datastr=list_from_line[:-1]#这里得到的是字符串类型,而非浮点型
    data=float(datastr)#转化为浮点型
fr.close()#关闭文档

这个方法要注意的是:
(1)文件的打开和关闭需要我们处理,比较麻烦
(2)从文本中直接读到的序列是字符串,而非浮点型(虽然文本表面上看起来是浮点型),要获取元素的类型可以直接用函数type(datastr[1])
文本内容看起来如下:
1,0,0.99539,-0.05889,0.85243,0.02306,0.83398,-0.37708,1,0.03760,0.85243,-0.17755,0.59755,-0.44945,0.60536,-0.38223,0.84356,-0.38542,0.58212,-0.32192,0.56971,-0.29674,0.36946,-0.47357,0.56811,-0.51171,0.41078,-0.46168,0.21266,-0.34090,0.42267,-0.54487,0.18641,-0.45300,g
1,0,1,-0.18829,0.93035,-0.36156,-0.10868,-0.93597,1,-0.04549,0.50874,-0.67743,0.34432,-0.69707,-0.51685,-0.97515,0.05499,-0.62237,0.33109,-1,-0.13151,-0.45300,-0.18056,-0.35734,-0.20332,-0.26569,-0.20468,-0.18401,-0.19040,-0.11593,-0.16626,-0.06288,-0.13738,-0.02447,b
1,0,1,-0.03365,1,0.00485,1,-0.12062,0.88965,0.01198,0.73082,0.05346,0.85443,0.00827,0.54591,0.00299,0.83775,-0.13644,0.75535,-0.08540,0.70887,-0.27502,0.43385,-0.12062,0.57528,-0.40220,0.58984,-0.22145,0.43100,-0.17365,0.60436,-0.24180,0.56045,-0.38238,g
1,0,1,-0.45161,1,1,0.71216,-1,0,0,0,0,0,0,-1,0.14516,0.54094,-0.39330,-1,-0.54467,-0.69975,1,0,0,1,0.90695,0.51613,1,1,-0.20099,0.25682,1,-0.32382,1,b
….

方法一: 用pythoncsv模块
代码如下:

with open(data_file,'r') as input_file:
reader=csv.reader(input_file)#reader是一个字符串组成的序列,虽然文件内容看起来是整形和浮点型
for i,row in enumerate(reader):
    #data=[float(datnum) for datnum in row[:-1]]
    print(i,row)

这个方法要注意的是:
(1)虽然文本内容看起来是像浮点型和整型,但是用csv模块读进来后其实是一个字符串的序列。所以要座显示的类型转换
(2)相比于上个方法,我们不用去关心文本的打开与关闭,代码也是更为简洁

方法二: 利用pandas的read_csv函数
代码如下:

result=pd.read_csv('ionosphere.data')
for i,row in enumerate(np.array(result)):
    data=[float(datnum) for datnum in row[:-1]]
    data_set[i]=data

这个方法要注意的是:
(1)读进来的数据并不是字符串类型,而是根据具体的内容自动做了调整,例如,data[1]中存的是1或者0,直接返回的是int类型,而其他则是浮点型。
(2)虽然这里read_csv函数已经帮我们讲非字符串类型做了自动的转换,但是这样使得数组同时存在整型和浮点型,我们还是全部转化为浮点型的好,但是如果其他的文本存的都是相同类型的话,使用pandas的函数会使得文本处理变得格外容易

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值