Python 文件操作
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')
文件内光标移动
1: read(3):
(1. 文件打开方式为文本模式时,代表读取3个字符
(2. 文件打开方式为b模式时,代表读取3个字节
2: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
import time with open('test.txt','rb') as f: f.seek(0,2) while True: line=f.readline() if line: print(line.decode('utf-8')) else: time.sleep(0.2)
练习:基于seek实现tail -f功能
文件的修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
file对象常用的函数
.....................................
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串
学习内容
1.读文件(处理)
打开文件:
fp = open(文件名,文件的打开方式)
文件的打开方式。默认是r+。主要参数有r–只读,w–新建写,a–追加,(+)–可写,b–二进制方式。
常用的有r+ – 读写模式打开,rb+ – 二进制读写模式,wb+ – 二进制格式打开,用于读写,若文件已存在则覆盖,不存在则新建,a+ – 追加写。
读取文件
read(size): 读取size的字节数。size为空时,读取文件所有字节。
readlines(size):把读取到的值放在列表里存储并返回列表值。size并不是单纯的字节数,匹配到的是只要是大于某一行起始值的都会读出整行。
readline(size):若当前行的值大于size,则读当size值。若小于,则返回当前行。为空则返回整行。
迭代器:文件本身可以看做一个迭代器,循环操作。像下面这样循环遍历就可以全部读出了。
f = open("foo.txt")
for i in f:
print (i)
在文件内容比较大时,使用迭代器可以在不消耗大量内存的情况下,对文件进行操作。
文件写入
1.write(str):将字符串写入文件,一般情况下写入可以直接:
write("lily")
例子1:
readlines是按照行读文件
file=open('D:\\test.txt','r') for i in file.readlines(): # print(i) i=i.strip('\n') b=i.split(' ') if b[-1]=='18888888888': print('OMG') else: print(b) # for a in b: # print(a) # print(type(i)) file.close()
例子2:
追加内容,open里面操作所用到参数为a,注意换行符
file=open('D:\\test.txt','a') file.write('\nanihasaiyo1') file.close()
例子3:
删除内容:
1.把文件中所有内容放到一个变量里面
2.把满足条件的数据重新写到文件里面
with open('D:\\test.txt','r') as f: lines=f.readlines() with open('D:\\test.txt','w') as f1: for line in lines: if 'a' in line: continue f1.write(line)