文件的操做在从此的Python开发中也是使用很是频繁的。linux
#按照上面所说的流程 f = open('demo.txt')#1.打开文件,句柄赋值给f data = f.read()#2.对文件操做,读取文件内容 print(data)#打印文件 f.close()#3.关闭文件 #按照上面的流程,就完成了对文件的基本操做
前面咱们用打开文件,并无地方选择打开的模式,其实默认就是使用了“只读模式”(r),在只读模式下咱们只能读取文件内容,而不能对文件进行写入,追加等操做。windows
那若是想要写入怎么办,这里就要用到打开模式了。编码
打开文件是模式有以下:spa
那么如何使用呢?其实很简单,下面写一个例子:code
f = open('demo.txt','w') f.write('test') f.close() #咱们只须要在open的时候加上‘w’,就能够对文件进行写入操做了
若是想同时读取又能够写入怎么办?打开模式中有个‘"+"表示能够同时读写文件blog
还有一个“U”表示在读取时,能够将 \r\n自动转换成 \n内存
"b"表示处理二进制文件,若是咱们打开的文件不是文本,并且其余类型的文件就会用到这个模式utf-8
(使用场景:FTP发送上传的文件,linux中能够忽略,windows处理二进制文件时需标注)资源
前面咱们都没有使用到打开编码,其实默认都是 “gbk”开发
若是咱们文件是utf-8编码的格式,且内容中存在中文,则读取的时候不会报错能够正常读取,
若是文件是utf-8编码格式的,内容中添加了中文,这个时候咱们默认编码打卡就会报错,以下:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 5: illegal multibyte sequence
这个时候后咱们就要用到 encoding 对打开文件编码格式的修改:
f = open('demo.txt','r+', encoding='utf-8') #加上encoding='utf-8'就不会出现报错,或者中文乱码了
前面咱们读取文件内容,都是一次性读取所有内容,这样操做若是文件小还行,若是文件特别大,内容特别多,好比1G、10G等,则会让咱们的电脑卡死,甚至内存溢出。
针对大文件的操做,咱们其实能够每次只读一行,读完一行在内存中就删除
f = open('demo.txt','r+', encoding='utf-8') #只要使用这种循环,读一条,删一条,内存中只保存一行数据 for line in f: print(line) f.close() #此方法针对大文件操做效果显著
上面咱们用追加模式打开,而后写入文件就能够把追加的内容写入到文件中了。
若是要修改和删除,是否是用读写模式,把内容读出来,修改或删除内容,而后在重新写入到文件中,就能够实现删除和修改了。
可是,咱们刚刚提到了大文件,假设20G的文件,你不可能所有读出来,在修改或删除相应内容以后,在从新写入文件,你的程序直接卡死了。那怎么办呢?
其实仍是用到上面大文件操做的方式,咱们一条一条读,而后一条一条写
#思路就是一行一行读出源文件内容,在一行一行写入新的文件中 f = open('demo.txt', 'r+', encoding='utf-8')#原文件 f2 = open('demo2.txt', 'a', encoding='utf-8')#修改后保存的新文件 for line in f: #判断若是行中有出现'zhangsan'则修改为'lisi' if 'zhangsan' in line: line = line.replace('zhangsan', 'lisi') #判断若是行中有出现'wangwu'则跳过,既这行不添加到新文件,至关于删除了这行 elif 'wangwu' in line: continue f2.write(line)#最后修改过的内容一行一行写入到新的文件中 print(line) f.close() f2.close()
前面咱们说了,文件打开就要关闭。可是咱们常常忘记关闭,怎么办呢?
Python提供了一个 with语句,使用方式:
#使用with语句,当with代码块执行完毕时,内部会自动关闭并释放文件资源。 with open('demo.txt', 'r', encoding='utf-8') as f: pass #在Python2.7之后,with还同时支持操做多个文件 with open('demo.txt', 'r', encoding='utf-8') as f, open('demo2.txt', 'r', encoding='utf-8') as f2: pass
关于Python中的文件操做经常使用的方法就写这么多,还有一些如
tell
seek
seekable...等等之类的方法,在你们实际使用的时候在具体了解吧。