NumPy库---文件操作

NumPy库—文件操作

1. CSV文件操作

1.1 文件保存

有时候我们有了一个数组,需要保存到文件中,那么可以使用np.savetxt来实现:
使用help(np.savetxt)查看相关用法。

np.savetxt(frame,array,fmt='%.18e',delimiter=None)
* frame: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
* array: 存入文件的数组
* fmt: 写入文件的格式,例如:%d %.2f %.18e
* delimiter: 分割字符串,默认是任何空格

示例1

a = np.arange(100).reshape(5,20)
np.savetxt("a.csv",a,fmt="%d",delimiter=",")

示例2

scores = np.random.randint(0,100,size=(20,2))
scores
# result:
array([[99, 63],
       [56, 43],
       [69, 49],
       [73, 23],
       [ 9, 42],
       [35, 98],
       [25, 46],
       [23, 97],
       [68, 98],
       [71, 23],
       [ 1, 72],
       [65, 85],
       [63, 45],
       [10, 32],
       [38, 41],
       [ 5, 49],
       [19, 15],
       [37, 66],
       [ 3, 38],
       [30, 67]])

np.savetxt("score.csv",scores,delimiter=",",header="英语,数学",comments="")
# comments的作用是去除“英语”字样前的'#'号键

score.csv文件打开截屏
在这里插入图片描述

1.2 读取文件

有时候我们的数据是需要从文件中读取出来,那么可以使用np.loadtxt来实现:

np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
* frame: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
* dtype: 数据类型,可选
* delimiter: 分割字符串,默认是任何空格
* skiprows: 跳出前面x行
* usecols: 读取指定的列,用元组组合
* unpack: 如果True,读取出来的数组是转置后的

示例

b = np.loadtxt("score.csv",dtype=np.int,delimiter=",",skiprows=1)
b

# result:
array([[99, 63],
       [56, 43],
       [69, 49],
       [73, 23],
       [ 9, 42],
       [35, 98],
       [25, 46],
       [23, 97],
       [68, 98],
       [71, 23],
       [ 1, 72],
       [65, 85],
       [63, 45],
       [10, 32],
       [38, 41],
       [ 5, 49],
       [19, 15],
       [37, 66],
       [ 3, 38],
       [30, 67]])

2. np独有的存储解决方案

numpy中还有一种独有的存储解决方案。文件名是以.npy或者.npz结尾的。以下是存储和加载的函数:

  1. 存储np.save(fname,array)np.savez(fname,array)。其中,前者函数的扩展名是.npy,后者的扩展名是.npz,后者是经过压缩的。
  2. 加载np.load(fname)
    示例1
# 存储
c = np.random.randint(0,10,size=(2,3))
np.save("c",c)
# 加载
c1 = np.load("c.npy")
c1
# result:
array([[4, 1, 3],
       [8, 5, 0]])

示例2

d = np.random.randint(0,10,size=(2,3,4))
# np.savetxt("d.csv",d) 只能保存一维或二维数组,其他会报错
np.save("d",d)

3. csv文件处理

csv的解释:
CSV并不是一种单一的、定义明确的格式。因此在实践中,术语CSV泛指具有以下特征的任何文件:

  1. 纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312(简体中文环境)等;
  2. 由记录组成(典型的是每行一条记录);
  3. 每条记录被分隔符分隔成字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
  4. 每条记录都有同样的字段序列。

3.1 读取csv文件

import csv
def read_csv_demo1():
    with open('stock.csv','r') as fp:
        # reader是一个迭代器
        reader = csv.reader(fp)
        # 不想要标题这一行
        next(reader)
        for x in reader:
            name = x[3]
            volumn = x[-1]
            print({'name':name,'volumn':volumn})
            # print(x)

if __name__ == '__main__':
    read_csv_demo1()

这样操作,以后获取数据的时候,就要通过下表来获取数据的时候通过标题来获取,那么可以使用DictReader

import csv
def read_csv_demo2():
    with open('stock.csv','r') as fp:
        # 使用DictReader创建的reader对象
        # 不会包含标题那行的数据
        # reader是一个迭代器,遍历这个迭代器,返回来的是一个字典
        reader = csv.DictReader(fp)
        for x in reader:
            value = {"name":x['secShortName'],"volumn":x['turnoverVol']}
            print(value)
            # print(x)
if __name__ == '__name__':
    read_csv_demo2()

3.2 写入数据到csv文件

写入数据到csv文件,需要创建一个writer对象,主要到两个方法。一个是writerow,这个是写入一行;一个是writerows,这个是写入多行:

import csv
def write_csv_demo1():
    headers = ['name','age','classroom']
    values = [
        ('zhiliao',18,'111'),
        ('wena',20,'222'),
        ('bbc',21,'111')
    ]
    with open('test.csv','w',encoding='utf-8',newline='') as fp:
        # newline=''的意思是不自动换行
        writer = csv.writer(fp)
        writer.writerow(headers)
        writer.writerows(values)

if __name__ == '__main__':
    write_csv_demo1()

也可以使用字典的方式把数据写入进去,这时就需要使用DictWriter了:

import csv
def write_csv_demo2():
    headers = ['name','age','classroom']
    values = [
        {"name":'wena',"age":20,"classroom":'222'},
        {"name":'bbc',"age":21,"classroom":'111'}
    ]
    with open('test.csv','w',newline='') as fp:
        # newline=''的意思是不自动换行
        writer = csv.DictWriter(fp,headers)
        # 表头不会自动写入进去,需要调用writeheader()
        writer.writeheader()
        writer.writerow({"name":'zhiliao',"age":18,"classroom":'111'})
        writer.writerows(values)

if __name__ == '__main__':
    write_csv_demo2()

Summary

  1. np.savetxtnp.loadtxt一般用来操作csv文件,但是不能存储三维以上的数组。
  2. np.savenp.load一般用来存储非文本类型的文件,可以不设置header,但是可以存储3维以上的数组。
  3. 如果想专门操作csv文件,其实还有另外一个模块叫做csv,这个模块是python内置的,不需要安装。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeGLMath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值