美文网首页
python---基本知识21之文件操作

python---基本知识21之文件操作

作者: hello_我的哥 | 来源:发表于2018-01-30 15:29 被阅读38次

    文件介绍:文件其实没什么好介绍的,我们在平时工作以及使用电脑的时候,都会用到各种各样的文件,首先,文件有多种格式,比如.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('../'))

    相关文章

      网友评论

          本文标题:python---基本知识21之文件操作

          本文链接:https://www.haomeiwen.com/subject/ivnnaxtx.html