pytorch基础-打开指定路径的文件并加载数据

1、with open() as f 用法

对文件进行读写操作,实例中的 rb 是以二进制格式打开一个文件用于只读,f 代表该路径下的文件,如果文件打开成功,调用 f.read() 方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示。

最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

 f = open('/Users/michael/test.txt', 'r')
 f.read()    #'Hello, world!'
 f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,Python引入了with语句来自动帮我们调用close()方法:

with open('data.txt', 'wb+',encoding='gbk',errors='ignore') as f:
   f.write('hello world')  #文件的写操作
   print(f.read())
   for line in f.readlines():
      print(line.strip()) # 把末尾的'\n'删掉

调用 read() 会一次性读取文件的全部内容,如果文件有5G,内存就爆了,对于写入操作也是一样的。所以,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。

总结:以后读写文件都使用with open语句。以下是其他类型的操作:

with open() as f 用法_青春须早为,岂能长少年的博客-CSDN博客_withopen

2、os.path.join()函数用法

函数用于路径拼接文件路径,可连接两个或更多的路径名组件。

如果不存在以‘’/’开始的参数,则函数会自动加上。

如果存在以‘’/’’开始的参数,从最后一个以”/”开头的参数开始拼接,之前的参数全部丢弃。

如果只存在以‘’./’开始的参数,会从”./”开头的参数的上一个参数开始拼接。

如果同时存在以‘’./’与‘’/’’开始的参数,以‘’/’为主,从最后一个以”/”开头的参数开始拼接,之前的参数全部丢弃。

import os
path='C:/yyy/yyy_data/'
print(os.path.join('path','abc','yyy'))  #path\abc\yyy
print(os.path.join('/aaa','/bbb','ccc.txt'))  #/bbb\ccc.txt
print(os.path.join('aaa','./bbb','ccc.txt'))  #/aaa\./bbb\ccc.txt
print(os.path.join(path,'abc'))  #C:/yyy/yyy_data/abc  路径连接的正确调用

以下是具体的用法:

os.path.join()函数用法详解_swan777的博客-CSDN博客_os.path.join函数

3、numpy数据的存取np.save, np.load

np.loadnp.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。他们会自动处理元素类型和形状等信息。

np.save(file, arr)。以“.npy”格式将数组保存到二进制文件中。file 要保存的文件名称,需指定文件保存路径,如果未设置,保存到默认路径。其文件拓展名为.npyarr 为需要保存的数组,即把数组arr保存至名称为file的文件中。

numpy.savez函数将多个数组保存到一个文件中。输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。

np.load(file):从npy、npzpickle文件中加载数组或pickle对象,file 为要加载的文件名称。load函数可自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容。

#存储数组数据, .npy文件
import numpy as np
import os
os.chdir(r'C:\python')
ar = np.random.rand(5,5)
ar2 = np.arange(4)
np.save('arraytest.npy',ar)#如果文件路径末尾没有扩展名.npy,该扩展名会被自动加上。
#也可以直接np.save(r'C:\python\arraytest.npy',ar)
ar_load = np.load('arraytest.npy')#读取数组数据, .npy文件
print(ar_load)#也可以直接np.load(r'C:\python\arraytest.npy')

np.savez(r'C:\python\arraytest1.npz',ar,ar2)
r = np.load(r'C:\python\arraytest1.npz')
print(r)
print(r['arr_1'])#获取文件arr_1.npy保存的数组ar2的内容。

如果用解压软件打开files.npz文件的话,会发现其中有两个文件:arr_0.npy, arr_1.npy,其中分别保存着数组ar,ar2的内容。 输出结果:

[[0.11385598 0.93855815 0.24164259 0.92997359 0.69357122]
 [0.87645026 0.09039235 0.90440601 0.06960039 0.78774034]
 [0.84598001 0.31109399 0.35589666 0.31423151 0.97625527]
 [0.28850171 0.16488104 0.49139069 0.75205383 0.29547536]
 [0.71006248 0.10579702 0.27983614 0.32658499 0.99927041]]
<numpy.lib.npyio.NpzFile object at 0x0000021CF65E46A0>
[0 1 2 3]

更多用法详见:

numpy学习(五)——文件的保存和读写(np.save()、np.load()、np.savez()、np.savetxt()、np.loadtxt())_徕胖的博客-CSDN博客_np.save

4、Python改变元素的数据类型astype()方法

作用就是转换numpy数组的数据类型。在深度学习中,数据量往往很大,所以在保障数据精度的同时还要考虑计算效率,虽然float64比float32有更高的精度,但一个在内存中占分别64和32个bits,也就是4bytes或8bytes.

具体来讲,float64占用的内存是float32的两倍,是float16的4倍;比如对于CIFAR10数据集,如果采用float64来表示,需要60000323238/1024**3=1.4G,光把数据集调入内存就需要1.4G;如果采用float32,只需要0.7G,如果采用float16,只需要0.35G左右;占用内存的多少,会对系统运行效率有严重影响;(因此数据集文件都是采用uint8来存在数据,保持文件最小)

5、Python中的shape和reshape()函数用法

reshape() 是数组array中的方法,用于改变数组的形状,作用是将数据重新组织。reshape函数生成的新数组和原始数组公用一个内存,也就是说,不管是改变新数组还是原始数组的元素,另一个数组也会随之改变。

形状变化是基于数组元素不能改变的,变成的新形状中所包含的元素个数必须符合原来元素个数。如果数组元素发生变化的时候,就会报错。

import numpy as np
a = np.array([[1,2,3,4],[5,6,7,8]])  #一维数组
print(a.reshape(8))  #[1 2 3 4 5 6 7 8]

shape是查看数据有多少行多少列

a = np.array([[1,2,3,4],[5,6,7,8]])  #二维数组
print(a.shape[0])  #值为2,最外层矩阵有2个元素,2个元素还是矩阵。
print(a.shape[1])  #值为4,内层矩阵有4个元素。
print(a.shape[2])  #IndexError: tuple index out of range

6、np.newaxis的函数用法

作用是增加一个维度。

import numpy as np
a=np.array([1,2,3,4,5])
aa=a[np.newaxis,2:]
bb=a[2:,np.newaxis]
print(aa.shape)
print (aa)
print(bb.shape)
print (bb)
(1, 3)
[[3 4 5]]
(3, 1)
[[3]
 [4]
 [5]]

可以看出,用于切片,但是跟位置有关:

  1. 如果放在切片前面,原来的数据作为1列存在,形成1*n的二维数组;    np.newaxis :
  2. 如果放在切片后面,原来的数据作为行存在,形成n*1的二维数组;  :np.newaxis

索引多维数组时如下:

np.newaxis 为 numpy.ndarray(多维数组)增加一个轴_五道口纳什的博客-CSDN博客_newaxis

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只小小的土拨鼠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值