读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
pathlib模块
用模块pathlib来处理文件,是一种更加简单的文件读写方法。
from pathlib import Path
path = Path("pi_million_digits.txt")
contents = path.read_text(encoding="utf-8")
lines = contents.splitlines()
pi_string = ""
for line in lines:
pi_string += line.lstrip()
birthday = input("Enter your birthday, in the form mmddyy: ")
if birthday in pi_string:
print("Your birthday appears in the first million digits of pi!")
else:
print("Your birthday does not appear in the first million digits of pi.")
写入文件用write_text()方法。
Path类提供了很多很有用的方法。如果指定的文件或文件夹存在,exists()方法返回True,否则返回False。
文件打开模式
只读:rt、rb
- 存在,读
- 不存在,报错
- t 是文本类型,b 是二进制类型
覆盖写:wt、wb
- 存在,清空再写
- 不存在,创建再写
创建写:xt、xb
- 存在,报错
- 不存在,创建再写
追加模式:at、ab
- 存在,尾部追加
- 不存在,创建再写
读文件
read(size)
如果size未给定或为负则一次性读取文件所有内容,以字符串的形式返回结果:
with open("new.txt", 'r', encoding='utf-8') as f:
f.read()
# 读n个字符(字节)
with open("new.txt", 'r', encoding='utf-8') as f:
f.read(1) # 读1个字符
readline()
只读取文件一行的内容,以字符串的形式返回结果:
with open("new.txt", 'r', encoding='utf-8') as f:
f.readline() # 读第一行
f.readline() # 继续读下一行
readlines()
读取文件所有行,并且以列表的形式返回结果,一般配合for
使用
with open("new.txt", 'r', encoding='utf-8') as f:
for line in f.readlines():
line.strip() # 去掉换行符n
读大文件
with open("new.txt", 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())
读二进制文件
from io import SEEK_END, SEEK_SET
with open("1.jpg", "rb") as f:
# 将文件指针移动到文件末尾
f.seek(0, SEEK_END)
# 获取文件指针移动的字节数,即文件大小
print(f.tell())
# 将文件指针移动到文件开头
f.seek(0, SEEK_SET)
data = f.read(1024)
while data:
print(data, end="")
data = f.read(1024)
写文件
with open("new.txt", 'w', encoding='utf-8') as f:
f.write('李小龙') # 写在缓冲区,系统会将缓冲区的内容刷到硬盘
f.flush() # 立即刷到硬盘
writelines(s) 向文件写入一个元素为字符串的列表,如果需要换行则要自己加入每行的换行符。
光标位置
with open("new.txt", 'r+', encoding='utf-8') as f:
f.seek(3) # 移动到指定的字节位置,一个汉字3个字节
f.write('你好')
print(f.tell()) # 获取当前光标位置
在a模式下,调用write在文件中写入内容时,永远只能将内容写到尾部,不会写到光标的位置。
上下文管理
with open("new.txt", 'r', encoding='utf-8') as f1, open("new2.txt", 'w', encoding='utf-8') as f2:
pass
上下文管理可以自动实现关闭文件,进行文件操作时,推荐使用。
计算文件MD5
from hashlib import md5, sha256
hasher = md5()
hasher2 = sha256()
with open("1.jpg", "rb") as f:
data = f.read(1024)
while data:
# 更新MD5对象的数据
hasher.update(data)
hasher2.update(data)
data = f.read(1024)
# 获得16进制形式的MD5哈希摘要
print(hasher.hexdigest())
print(hasher2.hexdigest())