文件操作分为读、写、修改,以什么模式存文件,就以什么模式编码打开文件。
打开文件的模式有:
- r,只读模式(默认)。
# 以什么模式存文件,就以什么模式编码打开文件 # 示例一:r是文本只读模式 f = open(file=‘D:/工作/兼职联系信息.txt‘,mode=‘r‘,encoding=‘utf-8‘) # 绝对路径访问 data = f.read() f.close() # 示例二:rb:二进制只读模式,无法指定encoding,因为在该模式下数据读到内存里直接是bytes格式,如要查看内容还需手动decode f = open(file=‘兼职联系信息.txt‘, mode=‘rb‘)
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
# w模式是创建新文件,如果文件存在则清空重写 f = open(file=‘兼职.txt‘,mode=‘w‘,encoding=‘gbk‘) f.write(‘美女按摩服务,电话号:adfs123‘) f.close()
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
# a是追加模式 f = open(‘兼职联系信息.txt‘, ‘ab‘) f.write("\n白百何 北京 167 55 13523230322".encode("gbk")) # 换行追加 f.close()
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
f = open(‘兼职联系信息.txt‘,‘r+‘,encoding="gbk") data = f.read() print("content",data) f.write("\nnewline 1老师") f.write("\nnewline 2老师") f.write("\nnewline 3老师") f.write("\nnewline 4老师") print("new content", f.read()) # read不到结果,因为写入后光标已经移到末尾 f.close()
- w+,写读
# 写读是以创建的模式打开(将原来的东西覆盖),可以读取写入的内容 f = open("兼职联系信息.txt",‘w+‘,encoding="gbk") data = f.read() print("content", data) f.write("\nnewline 1学生") f.write("\nnewline 2学生") f.write("\nnewline 3学生") f.write("\nnewline 4学生") print("new content",f.read()) f.close()
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
# rb:二进制只读模式,无法指定encoding,因为在该模式下数据读到内存里直接是bytes格式,如要查看内容还需手动decode f = open(file=‘兼职联系信息.txt‘, mode=‘rb‘)
- wb
f = open(‘兼职2.txt‘,‘wb‘) # 写二进制 f.write("美女陪聊!".encode("gbk")) f.close()
- ab
f = open(‘兼职联系信息.txt‘, ‘ab‘) f.write("\n白百何 北京 167 55 13523230322".encode("gbk")) # 换行追加 f.close()
文件操作
f = open("兼职.txt",mode="r+",encoding="gbk") f.fileno() # 返回文件句柄在内核中的索引值,做IO多路复用可以用到 f.flush() # 把文件从内存buffer里强制刷新到硬盘 f.readable() # 判断是否可读 f.readline() # 只读一行,遇到\r \n 为止 f.seek() # 把操作文件的光标移到指定位置(按字节) f.seek(0) # 光标移动到文首 f.seekable() # 判断文件是否可进行seek操作 f.tell() # 返回当前文件操作光标位置(按字节) f.truncate() # 按指定长度截断文件(需要写权限),从光标当前位置开始往后截断 f.truncate(6) # 加上数字是从头开始截取6位字节 f.writable() # 判断文件是否可写 f.read() # 按字符,注意和tell和seek的区别
文件修改
# 修改文件时,先移动光标到指定位置,向文件写入内容 f = open(file = ‘兼职模特联系方式.txt‘,mode=‘a‘,encoding=‘gbk‘) f.write("安琪 170 50 13988888") f.write("白雪 167 48 13324434") f.write("刘琳 166 46 13828382") f.seek(22) # 移动光标到指定位置插入文件 f.write("\n") f.seek(42) f.write("\n") f.seek(62) f.write("\n") f.seek(0) f.read() f.close()
文件修改时占有硬盘,减少内存使用
mport os f_name = "兼职模特联系方式.txt" f_new_name = "%s.new" %f_name old_str = "白雪" new_str = "白百合" f = open(f_name,mode=‘r‘,encoding=‘utf-8‘) f_new = open(f_new_name,‘w‘,encoding=‘utf-8‘) for line in f: if old_str in line: line = line.replace(old_str,new_str) f_new.write(line) f.close() f_new.close() os.rename(f_new_name,f_name) # 新文件替代旧文件