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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,350评论 0 17
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,207评论 4 16
  • 1. Python的hello-world: print ("Hello, Python!")、 完了 摇就完事儿...
    LunarShade阅读 1,366评论 0 0
  • 记忆很美好,即便再糟糕也是曾经。现在很深刻,即便再普通也是当下。追风少年,再也没有曾经模样。当打之年,岂可辜负大美春光。
    千年琼水晾苏盐阅读 246评论 0 0
  • 2016的猴年,离我上一个本命年和下个本命年的时间,我需要掰着手指头,并背着“一鼠二牛三虎四兔……”才算的出来。 ...
    腿短人生长阅读 538评论 0 1