文件介绍:文件其实没什么好介绍的,我们在平时工作以及使用电脑的时候,都会用到各种各样的文件,首先,文件有多种格式,比如.txt,.api,.jpg等等,都是用来存储数据的,每种格式有每种格式的存取法则,如果一个文本文档用jpg打开肯定是乱码的,因为规则不一;下面开始介绍python的文件操作
python文件操作就和我们平时用电脑操作文件一样的,即打开文件,读写文件,关闭文件;
打开文件:使用的是open()函数,open函数有很多接收参数,最重要的就是文件路径和操作方式;
文件路径:分为绝对路径和相对路径;绝对路径就是完整的描述文件位置的路径就是绝对路径,相对路径是是从当前路径开始的路径;
操作方式分为5种:
r:以只读的方式打开文件,读取文件的指针在文件开头,如果没有这个文件,那么会报错:如下面代码,那么file又是什么呢,file就是打开文件的时候获取的一根管道,我们都是通过这跟管道进行操作文件;通过调用file的方法read(),就可以读出文件的内容了;这个是打开文件的默认方式
file=open('ceshi.text','r')
content=file.read()
w:以只写的方式打开文件,如果文件不存在会重新创建一个新文件,写的指针在文件的开头,所以往里面写的时候会覆盖文件,
file=open('a.text','w')
file.write('e')
file.close()
a:和w模式差不多,也是以只写的方法打开文件,唯一的区别就是a模式的指针在文件末尾,所以这种方式往里面写就会追加在文件末尾;
file=open('a.text','a')
file.write('123')
file.close()
在讲下一种操作模式之前,我们应该先搞清楚,什么是文本文件,什么是二进制文件,其实对于电脑而言,存放的都是二进制数据,那为什么又有这两种文件呢,他们的区别就是在于打开这个文件的程序对于二进制的解释上,其实文本文件的解码格式是确定的,就是ASCII或者unicode编码,而音频视频这类文件当然不能使用ASCLL这种方式去解码,解出来的肯定是乱码,其实说白了就是你用什么编码去存,你就要用什么编码去取,文本文件只是一种特殊的二进制文件;也可以这样说,保存字符的文件就是文本文件,其他全是二进制文件;
b模式:其实就是binary,就是二进制模式,比如我们要操作除了文本文件以外的文件,就用b模式,其实就在r,w的后面加一个b就行:下面的代码是复制图片的一半到另一个文件
readfile=open('image10.png','rb')
readcontent=readfile.read()
readfile.close()
writefile=open('write.png','wb')
writefile.write(readcontent[0:len(readcontent)//2])
writefile.close()
+模式:就是在前面所有的模式后面写一个加号,这种模式和没写加号的模式功能特点都差不多,也有细微差别这种模式代表既能读,又可以写,举个例子:比如下面这种方式,我们打开了a.text,然后先读出内容,这个时候指针就到了最后一个,再往里面写的时候,就成了追加;
file=open('a.text','r+')
content=file.read()
print(content)
file.write('abcd')
file.close()
定位:就是指我们要读取或者写入的时候,指针的位置,我们可以从头开始读,也可以从当前的指针位置,也可以从文件末尾往前面读;用的是seek()函数,另外tell()函数是告诉我们指针的位置;比如下面的代码,seek(),第一个值是offset偏移量,第二个值是可选的相对哪个地方的偏移量,默认是0就是文件开始,1是当前指针,2是末尾指针;另外需要注意一点就是如果是文本文件的话,whence就只能是0,1和2只能是二进制文件才可以;
file=open('a.text','rb')
print(file.tell())
file.seek(-4,2)
print(file.tell())
print(file.read())
print(file.tell())
file.close()
读:就是读取我们存的内容;
1.使用read(),里面有一个可选参数,意思是需要读取的字节数,默认是文件内容长度,下标会自动后移:
file=open('a.text','rb')
print(file.tell())
file.seek(-4,2)
print(file.tell())
print(file.read(2))
print(file.tell())
file.close()
2.使用readline(),里面也有一个可选参数,默认就是一行的字节数,意思是需要读取的字节数,下标也会自动后移:注:换行占两个字节
file=open('a.text','r')
print('=====',file.tell())
print(file.readline())
print('=====',file.tell())
print(file.readline())
print('=====',file.tell())
print(file.readline(2))
print('=====',file.tell())
3.使用readlines(),会自动将文件按换行符进行处理,返回的是每行组成的一个列表;我们可以看到下面的结果就是一个列表,里面的元素就是每一行的值包括换行符;
file=open('a.text','r')
print(file.readlines())
file.close()
结果:['123\n', '4\n', '56789']
4.遍历,我们可以用for in 遍历file本身,也可以遍历通过readlines()返回的列表:首先我们看file是否可以遍历,是检查file是否是iterrator,检查出来结果是是迭代器,那么我们可以迭代,通过迭代结果表示,迭代过程也是按照行进行的迭代:也就和我们readlines迭代结果一样;
import collections
file=open('a.text','r')
isc=isinstance(file,collections.Iterator)
print(isc)
for i in file:
print(i,end='')
5.判定是否可读,或者是否可写:主要是增加程序容错率,通过readable和writable,able表示能力;
print(file.readable())
print(file.writable())
注意:我们学了这么多读取的方法,那我们什么时候该使用什么方法呢,这个就要根据文件大小决定了,如果文件特别大的话,我们肯定不能使用一次性读取所有文件的方法了,因为这种方法很耗内存,这种情况我们就应该一行一行的读,就可以使用readline或者用file这个迭代器,当文件比较小的时候,我们就可以一次性读完,使用read和readlines方法;
写入:就是用的write()函数,之前已经用过了,只需要知道一点就是write函数有返回值,并且这个返回值就是写入的字节数,我们写了多少个字节进去就会返回多少;
关闭:close(),其实他有两个作用,第一是可以释放系统资源,第二是可以把缓冲区的数据立马写进磁盘,比如我们系统只有10根管道,那现在10根管道都被使用了,那在需要使用管道的时候,是不是就没了呢,就会等前面的用完了才有管道使用了,所以我们用完就赶紧释放,不然占着茅坑不拉屎,系统会很慢的,第二点,我们在执行写数据的时候,其实并不是一执行到write就会立马往磁盘写,而是先放入缓冲区,等缓冲区满了才往里面写,或者等一会才写入,就为了减少io操作次数,说白了也是为了不浪费资源,而当我们执行了close过后就会立马把缓冲区的数据写进磁盘;补充:flush()也可以达到把缓冲区的数据写进磁盘:
file=open('a.text','w')
file.write('aaa')
file.flush()
file.close()
文件的相关操作:操作文件是在os模块下,所以我们应该先导入os模块,然后执行各种操作:
1.修改单个文件夹或者文件,使用rename():
import os os.rename('alone','busy')
os.rename('a.text','b.text')
2.修改树状级文件:使用renames():
os.renames('busy/busy.text','alone/alone.text')
3.删除文件:remove()函数,如果文件不存在则报错:
os.remove('b.text')
4.删除文件夹:rmdir,不能递归删除文件夹,如果文件夹不为空则报错
os.rmdir('alone')
5.删除文件夹:removedirs(),递归删除文件夹,如果文件夹不为空则报错;
os.removedirs('alone/a')
6.创建单个文件夹:
os.mkdir('a')
7.递归创建多个文件夹:
os.makedirs('v/b')
8.获取当前目录:
print(os.getcwd())
9.改变默认目录:
os.chdir('v')
10.获取目录内容列表,返回的是列表:其中'./'表示当前目录,‘../’表示上一层目录;
print(os.listdir('./'))
print(os.listdir('../'))