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
结尾的。以下是存储和加载的函数:
存储
:np.save(fname,array)
或np.savez(fname,array)
。其中,前者函数的扩展名是.npy
,后者的扩展名是.npz
,后者是经过压缩的。加载
: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
泛指具有以下特征的任何文件:
- 纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312(简体中文环境)等;
- 由记录组成(典型的是每行一条记录);
- 每条记录被分隔符分隔成字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
- 每条记录都有同样的字段序列。
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
:
np.savetxt
和np.loadtxt
一般用来操作csv文件,但是不能存储三维以上的数组。np.save
和np.load
一般用来存储非文本类型的文件,可以不设置header
,但是可以存储3维以上的数组。- 如果想专门操作
csv
文件,其实还有另外一个模块叫做csv
,这个模块是python
内置的,不需要安装。