Python文件操作入门教程:文本与二进制文件读写方法详细说明需要先看清适用场景和关键步骤,避免只记结论却忽略实际限制。
按照数据的组织形式,文件大致可以分为以下两类:文本文件与二进制文件。前者是由若干字符组成的文件,可以用文本编辑器进行阅读或编辑,例如以.txt、.py以及.html为后缀的文件都是文本文件。
二进制文件是无法用文本编辑器打开的,需要使用特定的软件打开,例如.mp3、.png等格式的文件。我们下面介绍对于文件的基本操作。
对文件的所有读写操作都是建立在打开文件的基础上进行的,并且文件的打开方式可以有多种。
'r’代表read只读、'w’代表write覆盖写、'a’代表append在文件末尾追加以及’b’代表打开二进制文件,默认情况下认为open()是以只读模式打开,例如f=open("Sample.txt"),所以如果该文件不存在,程序将会报错。
当对文件的内容操作完以后,一定要关闭文件,这样才能保证所修改的数据保存到文件中去,同时也释放内存资源以供其他程序使用,关闭文件使用close()函数,f.close().
当然,如果你的程序在open()之后,close()之前发生了错误导致程序异常中断,那么文件就没有被正常关闭。
所以在管理文件对象时使用with-as语句可以有效避免这类问题,不再需要显式的close()语句,基本的语法格式如下:
with open("Sample.txt") as f: str1=f.read() print(str1)关于文本文件的读写操作,我们可以放在一起介绍:
for line in f:这样的循环形式来读取文件中的每一行;文本文件使用字符序列来存储数据,而二进制文件使用字节序列存储数据,它只能使用特定的读取器读取。Python中的pickle模块提供了将数据序列化与反序列化的功能。
在介绍write()方法是我们提到过文件指针,它用于标志当前读写文件的位置,我们正是通过文件指针来对文件进行各种操作的。
shutil模块中提供了我们常见的复制、移动文件操作,os模块中则提供了重命名与删除的文件操作。
shutil.copy(r"D:UserSample.txt",r"D:UserDataSample.txt");Python标准库中提供了array类型用于保存数组类型的数据,但这个array不支持多维数据,处理函数也不够丰富,不适合数值运算,而Numpy库已经成为了科学计算事实上的标准库。
Numpy库中最基本的数据类型是由同种元素构成的多维数组ndarry,简称数组。
下面我们介绍Numpy中常用的函数,和实际使用中import numpy as np一样,我们在下面的介绍中也用np代替numpy.
示例代码如下所示:
import numpy as npArray1=np.array([1,2,3,4])Array2=np.array([[1,2],[2,3]])Array3=np.array((1,2,3,4))Array4=np.array(((1,2,3),(3,4,5)))print(Array1)print(Array2)print(Array3)print(Array4)

我们给出一段示例代码,具体看看是什么样子:
import numpy as nplist=[]list.append(np.arange(1,10,2))list.append(np.linspace(0,100,5))list.append(np.random.rand(3,4))list.append(np.ones((3,4),int))list.append(np.zeros((3,4),int))list.append(np.eye(3))index=0for i in list: print(index,i) index=index+1


import numpy as nparr=np.eye(5)print(arr)print(arr.ndim)print(arr.shape)print(arr.size)print(arr.dtype)print(arr.itemsize)

import numpy as nparr=np.eye(6)print(arr)print(arr.reshape(4,9))arr.resize(4,9)print(arr.swapaxes(0,1))print(arr.flatten())arr.resize(4,3,3)print(arr)
代码的运行结果如下,为了明显显示出形态变化,这个数组设置得有些大,可以对照着每一步的代码,检查每一步的输出:
1:[[1. 0. 0. 0. 0. 0.] [0. 1. 0. 0. 0. 0.] [0. 0. 1. 0. 0. 0.] [0. 0. 0. 1. 0. 0.] [0. 0. 0. 0. 1. 0.] [0. 0. 0. 0. 0. 1.]]2:[[1. 0. 0. 0. 0. 0. 0. 1. 0.] [0. 0. 0. 0. 0. 1. 0. 0. 0.] [0. 0. 0. 1. 0. 0. 0. 0. 0.] [0. 1. 0. 0. 0. 0. 0. 0. 1.]]3:[[1. 0. 0. 0.] [0. 0. 0. 1.] [0. 0. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 0. 0.] [1. 0. 0. 0.] [0. 0. 0. 1.]]4:[1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. - 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1.]5:[[[1. 0. 0.] [0. 0. 0.] [0. 1. 0.]] [[0. 0. 0.] [0. 0. 1.] [0. 0. 0.]] [[0. 0. 0.] [1. 0. 0.] [0. 0. 0.]] [[0. 1. 0.] [0. 0. 0.] [0. 0. 1.]]]
ndarray是支持像Python原生的list、string那样的索引和切片操作的:
import numpy as nparr=np.eye(6)print(arr[2][3])arr=np.array([1,2,3,4,5,6])print(arr[1:5])print(arr[1:6:2])print(arr)

这些函数中的x 1 _1 1、x 2 _2 2参数是运算的两个操作数,y参数可选,若y参数指定了则将运算结果保存到y中,否则创建一个新的数组保存计算结果。
import numpy as nparr1=np.array([1,2,3,4])arr2=np.array([2,4,6,8])print(arr1+arr2)print(arr2-arr1)print(arr1*3)print(arr1/2)print(arr1//2)print(arr1**2)print(arr2%3)print(arr1+9)print(arr1*arr2)print(arr2/arr1)print(arr1**arr2)print(arr1%arr2)

不难发现,其中的运算规律是这样的:
当然,我们上面给出代码中的算数运算符都可以写成np.add(arr1,arr2)这样的形式,不过既然有简洁明了的写法,何必呢。
ndarray也支持逻辑运算符,也就是我们常见的<、>等逻辑运算:
import numpy as nparr1=np.array([1,2,3,4])arr2=np.array([2,4,6,8])print(arr1<arr2)print(arr2<=arr1)print(arr1>arr2)print(arr1>=arr2)print(arr1==arr2)print(arr1!=arr2)print(arr1*2==arr2)

Python的封装做得相当好,对应Numpy中的ndarray类型,几乎让我们像使用int变量一样使用ndarray,这也是我们选择使用运算符,而不是函数调用形式的原因。
import numpy as nparr1=np.array([-1,2,-3,4])arr2=np.array([1.2,2.6,3.5,4.9])print(np.sign(arr1)) #[-1 1 -1 1]arr1=np.abs(arr1)print(arr1)#[1 2 3 4]print(np.sqrt(arr1))#[1. 1.41421356 1.73205081 2. ]print(np.square(arr1))#[ 1 4 9 16]print(np.ceil(arr2))#[2. 3. 4. 5.]print(np.floor(arr2))#[1. 2. 3. 4.]print(np.rint(arr2)) #[1. 3. 4. 5.]arr1=np.exp(arr1)print(arr1)#[ 2.71828183 7.3890561 20.08553692 54.59815003]print(np.log(arr1))#[1. 2. 3. 4.]arr3=np.array([10,100,1000,10000])print(np.log10(arr3))#[1. 2. 3. 4.]arr3=np.array([1024,2048,4096,65536])print(np.log2(arr3))#[10. 11. 12. 16.]
程序输出的结果,都在每一个print语句之后的注释中了。