文件操作
操作系统读写文件的一般流程:
(1)打开文件,产生文件句柄。
(2)对文件句柄进行操作。
(3)关闭文件句柄
文件句柄:
在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。
1 读 r
(1)全部读出来read()
f1=open('log.txt',encoding='utf-8') content=f1.read() print(content) f1.close()
结果为: abcde fghigk lmnopq
(2)读一部分 read(n)
f2=open('test.txt',encoding='utf-8') print(f2.read(3)) f2.close() 结果为:你好五
f3=open('test.txt','rb') print(f3.read(3).decode('utf-8')) f3.close() 结果为:你
说明:
r 模式 read(n) n 按照字符读取。
rb 模式 read(n) n 按照字节读取。
(3)按行读取 readline()
f4=open('test.txt',encoding='utf-8') print(f4.readline()) print(f4.readline()) f4.close() 结果为: 你好五月
第二行1abcdefghijklmnopqrstuvwxyz
(4)readlines() 读取所有行,并存入列表中
f5=open('test.txt',encoding='utf-8') print(f5.readlines()) f5.close() 结果为: ['你好五月\n', '第二行1abcdefghijklmnopqrstuvwxyz\n', '2345']
(5)for 循环逐行读取
f6=open('test.txt',encoding='utf-8') for line in f6: print(line) f6.close()
结果为:
你好五月 第二行1abcdefghijklmnopqrstuvwxyz 2345
(6)读写 r+ ,先读后写
f7=open('test.txt','r+',encoding='utf-8') print("原始文件为:",f7.read()) f7.write('aaaa') f7.seek(0) print("修改后文件为:",f7.read()) f7.close()
结果为:
原始文件为: 你好五月 第二行1abcdefghijklmnopqrstuvwxyz 2345 修改后文件为: 你好五月 第二行1abcdefghijklmnopqrstuvwxyz 2345aaaa
注意:
如果是Windows系统文件,加路径读取方式如下
f1=open(r'D:\Python\python\day03\test.txt',,encoding='utf-8')
2 写 w
(1)w 如没有文件,新建文件写入内容
有原文件,先清空内容,在写入新内容
f1=open('test2.txt','w',encoding='utf-8') f1.write('这个世界很疯狂') f1.close()
写入完毕,下来读取文件
f1=open('test2.txt',encoding='utf-8') print(f1.read()) f1.close()
结果为:这个世界很疯狂
(2)图片的读取及写入
原图如下
先来读取图片、目前读取二进制文件内容
p1=open('girl.jpg','rb') content = p1.read() print(content) p1.close()
结果为:b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xdb\x00C\x00\x03\x02\x02\x02\x02\x02\x03\x02\x02\x02\x03\x03\x03\x03\x04\x06\x04\x04\x04\x04\x04\x08\x06\x06\x05\x06\t\x08\n\n\t\x08\t\t\n\x0c\x0f\x0c\n\x0b\x0e\x0b\t\t\r\x11\r\x0e\x0f\x10\x10\x11\x10\n\x0c\x12\x13\x12\x10\x13\x0f\x10\x10\x10\xff\xdb\x00C\x01\x03\x03\x03\x04\x03\x04\x08\x04\x04\x08\x10\x0b\t\x0b\x10\x10 \x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x………………….
写入,也是用二进制编码写入
p1=open('girl.jpg','rb') content = p1.read() print(content) p2 = open('girl2.jpg', 'wb') p2.write(content) p1.close() p2.close()
(3)w+先写后读
f2=open('log2.txt','w+',encoding='utf-8') f2.write('我在测试先写后读') f2.seek(0) print(f2.read()) f2.close() 结果为:我在测试先写后读
(4)a 没有文件则新建文件并写入,有的话直接追加
a:附加写方式打开,不可读
先追加
f3=open('log3.txt','a',encoding='utf-8') f3.write('今天是周一\n') f3.seek(0) f3.close()
在读取
f4=open('log3.txt',encoding='utf-8') print(f4.read()) f4.close() 结果为:今天是周一
(5)a+: 附加读写方式打开
f5=open('log4.txt','a+',encoding='utf-8',) f5.write('我在测试a+模式') f5.seek(0) print(f5.read()) f5.close() 结果为:我在测试a+模式
(6)其他操作方法
# readable 是否可读 # writable 是否可写 # f1.seek(12) # 任意调整 # f1.seek(0,2) #光标调整到最后 # f1.seek(0) #光标调整到开头 # f1.tell() # 告诉光标的位置 # f1.truncate(3) # 按照字节对原文件进行截取 必须在a 或 a+ 模式
(7)不用主动关闭文件句柄
with open('log.txt',encoding='utf-8') as f6: print(f6.read()) 结果为: abcde fghigk lmnopq rstuvwxy
当然也可一次操作多个文件
with open('log.txt',encoding='utf-8') as f6,\ open('log3.txt','a+',encoding='utf-8') as f7: print(f6.read()) f7.write('文件句柄测试') f7.seek(0) print(f7.read())
结果为:
abcde fghigk lmnopq rstuvwxy 今天是周一 今天是周一 文件句柄测试
3 改
(1)以读模式打开原文件。
(2)以写的模式打开一个新文件。
(3)将原文件读出按照要求修改将修改后的内容写入新文件。
(4)删除原文件。
(5)将新文件重命名原文件。
import os with open('file', encoding='utf-8') as f1,\ open('file.bak', encoding='utf-8', mode='w') as f2: old_content = f1.read() new_content = old_content.replace('abc', 'hhh') f2.write(new_content) os.remove('file') os.rename('file.bak', 'file')
#升级版本
import os with open('file', encoding='utf-8') as f1,\ open('file.bak', encoding='utf-8', mode='w') as f2: for line in f1: new_line = line.replace('abc','hhh') f2.write(new_line) os.remove('file') os.rename('file.bak', 'file')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)