python 文件读写
创建一个文件对象
创建完对象记着关闭,使用 with as的方法可以自动关闭对象,避免复杂的写法。
# 常规
try:
f = open("b.txt", "r+")
except FileNotFoundError as e:
print('没有找到文件')
finally:
if f:
f.close()
# with as
with open("b.txt", "r+") as f:
pass
打开方式 | 模式 | 文件 | 指针 |
---|---|---|---|
r | 只读 | 无文件抛出FileExistsError | seek(0,0) |
w | 只写 | 创建文件,已有文件覆盖(不可以创建目录,需要请使用makedirs()等os方法) | seek(0,0) |
x | 创建 | 创建文件,已有文件抛出FileExistsError | seek(0,0) |
a | 追加 | 没有文件则创建文件 | seek(0,2)不可更改 |
b | 二进制 | 无更改 | |
t | 文本模式(默认) | 无更改 | |
+ | 获得读写的功能 | 无更改 |
-
seek定义
offset ( 偏移量)
whence:可选,默认值0。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
我们看到seek方法有一个返回值int,这个就是文件的指针索引。
@abstractmethod def seek(self, offset: int, whence: int = 0) -> int: pass
b.txt文件中的内容:abcdefg**。一共有有9个字符。
代码1-3 f = open(r"E:\PycharmProjects\pythonProject1\b.txt", "r+") f.seek(0,1) #r+模式默认字符指针为0 0 f.seek(15) #偏移量加15,字符指针指向15。 15 f.seek(16) #偏移量加16,字符指针指向16,偏移量并没有累加,每次都是绝对于0变化。 16 f.seek(0) 0 f.seek(1,1) #whence不为默认参数0的话,offset(偏移量)一定要为0,否则抛出错误。 Traceback (most recent call last): File "<input>", line 1, in <module> io.UnsupportedOperation: can't do nonzero cur-relative seeks f.seek(0,2) #看了上一条就知道whence不为0,offset(偏移量)是没有价值的,原字符的长度为9,所以末尾的字符指针指向9。 9 f.seek(0,1) #上一条指向9,所以当前位置也等于9。 9
-
读入和写出常用函数
代码1-4 with open("a.txt", "w+", encoding="utf-8") as f: print(f.writable()) # 是否可以写 print(f.readable()) # 是否可以读 print(f.tell()) # 返回当前字节数 f.tell()等价于f.seek(0, 1)、 f.write("将进酒\n") # 全部写入 f.writelines(["君不见黄河之水天上来,", "奔流到海不复回。\n", "君不见高堂明镜悲白发,", "朝如青丝暮成雪。\n"]) # 数组写入 f.seek(0, 0) print(f.read(), end='') # 全部读 f.seek(0, 0) print(f.readline(), end='') # 读一行 for s in f.readlines(): # 一行一行的读 print(s, end='') f.seek(0, 0) print(f.readline(10)) print(f.readline(1)) print(f.readline(1)) print(f.readlines(18)) # 18>光标大于当前行,小于下一行,从当前位置输出到下一行结束 print(f.readlines(1)) # 光标已经结尾,输出空行 f.seek(15, 0) f.truncate() # 从文章开头保留到光标位置,一共15个字节,和上一句一起可以简化为 f.truncate(15)。
注:行输出包括换行回车(windows:'/n')。
遇到中文python自动使用'GBK',如果文本是其他格式,打开文件要用encoding="格式"选择指定的格式。
默认的打开模式为文本。
假如文本有10个字符,在已有0字符位写入8个字符,将会覆盖原来字符(1-8),没有没覆盖的则不变(9-10)。
-
实例
在b.txt(abcdefg**)中的**前面插入一个’/‘,并输出b.txt的长度和b.txt的内容。
代码1-5 with open("b.txt", "r+") as f: f.seek(0,2) f.write('*') f.seek(7) f.write('/') print(f.seek(0,2)) f.seek(0) print(f.read())
将一个视频复制一份。
代码1-6
with open(r'C:\Users\raoji\Videos\Captures\绝地求生 2018-10-11 18-46-14.mp4','rb') as f:
with open(r'C:\Users\raoji\Videos\Captures\绝地求生1.mp4', 'wb') as f1:
s = f.read(1024)
while s != b'':
f1.write(s)
s=f.read(1024)