博客整理day09
目录
Python day09
一 文件处理
-
什么是文件
操作系统提供的虚拟概念,存储信息(用二进制存储信息)
-
操作文件的流程
# 1. 打开文件 # ①文件路径②打开模式,w-->write③ # print('D:\上海python12期视频\python12期视频\day 09\test.py') # print('D:\上海python12期视频\python12期视频\day 09\\test.py') # \\t--》第一个\会让第二个\失去意义 # print(r'D:\上海python12期视频\python12期视频\day 09\test.py') # r会让内部所有的\失效 f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py','w',encoding='utf8') # 2. 修改/读取文件 f.write(''' 孩儿立志出湘关,学不成名誓不还 埋骨何须桑之地,人生无处不青山 ''') # 3. 保存文件 f.flush() # 快速保存,你可以不使用 # 4. 关闭文件: python真的能操控文件?python通过操作系统操作文件 # del f f.close() # 告诉操作系统关闭文件
二 文件打开的三种模式
文件操作的基础模式有三种(默认的操作模式为r模式):
- r模式为read
- w模式为write
- a模式为append
文件读写内容的格式有两种(默认的读写内容的模式为b模式):
- t模式为text
- b模式为bytes
需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。
r模式
#读取:rt read_text 读文本内容 只读
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'rt', encoding='utf8')
f.write('slkdjfklj')
data = f.read()
print(data)
print(f.readable()) # 判断是否可读
print(f.writable()) # 判断是否可写
data = f.read() # 读取所有文本内容
print(data)
w模式
# wt: 只写(w清空文件后写入),不可读
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'wt', encoding='utf8')
print(f.readable())
print(f.writable())
f.write('abc')
a模式
at: 只写入(追加写入)
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'at', encoding='utf8')
print(f.readable())
print(f.writable())
f.write('中')
三 绝对和相对路径
-
文件的路径: 文件在硬盘的地址
-
绝对路径: 从盘符开始
-
相对路径: 执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
四 with管理上下文
# with提供一个自动关闭文件(接触了操作系统的占用)
with open('test.py', 'r', encoding='utf8') as f:
# print(f.read())
# 在这个缩进下不会关闭文件,在这个缩进下对文件操作
data = f.read() # data放到python的内存中
print(data)
# 关闭文件(操作系统),没有关闭python内存中的文件
print(f) # 只涉及python
# print(f.read()) # 涉及操作系统,报错
五 文件的高级应用
可读可写
#可写可读 r+
with open('test.py', 'r+', encoding='utf8') as fr:
# print(fr.readable())
# print(fr.writable())
fr.write('高级') # 光标在文件头部,覆盖后面的字符
#可写可读 w+ 和 w 没有任何区别
with open('test.py', 'w+', encoding='utf8') as fw:
print(fw.readable())
print(fw.writable())
#可写可读 a+ a模式默认光标在尾部
with open('test.py','a+',encoding='utf8') as fw:
print(fw.readable())
print(fw.writable())
fw.seek(0,0)
print(fw.read())
文件内指针移动
-
seek(offset,whence): offset代表文件指针的偏移量,偏移量的单位是字节个数
# seek() with open('36r.txt', 'rb') as fr: print(f"fr.seek(4, 0): {fr.seek(4, 0)}") # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾 # fr.seek(0,2) # 切换到文件末尾
-
tell(): 每次统计都是从文件开头到当前指针所在位置
# tell() with open('36r.txt', 'rb') as fr: fr.seek(4, 0) print(f"fr.tell(): {fr.tell()}")
-
read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数
# read() with open('36r.txt', 'rt', encoding='utf-8') as fr: print(f"fr.read(3): {fr.read(3)}")
-
truncate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。
# truncate() with open('36r.txt', 'ab') as fr: fr.truncate(2) # 截断2个字节后的所有字符,如果3个字节一个字符,只能截断2/3个字符,还会遗留1/3个字符,会造成乱码
六 文件修改的两种方式
方法一
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)。
import os
with open('37r.txt') as fr, \
open('37r_swap.txt', 'w') as fw:
data = fr.read() # 全部读入内存,如果文件很大,会很卡
data = data.replace('tank', 'tankSB') # 在内存中完成修改
fw.write(data) # 新文件一次性写入原文件内容
# 删除原文件
os.remove('37r.txt')
# 重命名新文件名为原文件名
os.rename('37r_swap.txt', '37r.txt')
print('done...')
方法二
将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件。
import os
with open('37r.txt') as fr,\
open('37r_swap.txt', 'w') as fw:
# 循环读取文件内容,逐行修改
for line in fr:
line = line.replace('jason', 'jasonSB')
# 新文件写入原文件修改后内容
fw.write(line)
os.remove('37r.txt')
os.rename('37r_swap.txt', '37r.txt')
print('done...')