python的常用文件操作os、shutil、open和pickle
目录
os 模块提供了非常丰富的方法用来处理文件和目录,python编程时,经常和文件、目录打交道,这是就离不了os模块。下面说说我常用的一些方法:
一、os文件和目录操作
1.判断操作
os.path.exists(path) #判断文件或目录是否存在
os.path.isfile(path) #判断是否为文件
os.path.isdir(path) #判断是否为目录
以上是返回值都为True,否返回False
2.目录的查看
os.listdir(path) #返回一个list,存储目录下所有的文件和目录名
遍历路径目录下的所有目录和文件
for root, dirs, files in os.walk(path): #文件、目录遍历器
print(root) #表示当前正在访问的目录路径
print(dirs) #表示该目录下的子目录名list
print(files) #表示该目录下的文件list
print("==========================")
3.目录的创建
os.mkdir(path) #只能创建path的最后一个目录
os.makedirs(path) #创建path的完整路径目录
4.目录和文件的删除
os.remove(path) #删除指定路径的文件
os.rmdir(path) #删除空目录
5.重命名文件或目录
os.rename(old_path, new_path) #将文件或目录名old_path修改为new_path
6.获取路径的最后部分
os.path.basename(r"My_program/test/code/train") #返回train
7.拆分目录和文件
os.path.split(r"My_program/test/code/train.py") #返回目录和文件名
8.连接目录与文件名或目录
os.path.join(r"My_program/test/code","train") #返回拼接的路径
二、shutil的常用操作
由于os文件操作没有移动和复制,所以用shutil做一些补充
1.复制文件或目录
shutil.copy(r"C:\Users\Desktop\1\1.jpg",r"C:\Users\Desktop\2") #将图片从目录1复制到目录2
shutil.copy(r"C:\Users\Desktop\1\1.jpg",r"C:\Users\Desktop\2\2.jpg") #将图片从目录1复制到目录2,并改名为2.jpg
2.移动文件或目录
shutil.move(r"C:\Users\Desktop\1\1.jpg",r"C:\Users\Desktop\2") #类似复制操作,只是不是复制而是移动
三、文件操作open
1.打开文件的常用模式
模式 | 可做操作 | 若文件不存在 | 是否覆盖 | 指针位置 |
---|---|---|---|---|
r | 只能读 | 报错 | - | 0 |
r+ | 可读可写 | 报错 | 否 | 0 |
w | 只能写 | 创建 | 是 | 0 |
w+ | 可写可读 | 创建 | 是 | 0 |
a | 只能写 | 创建 | 否,追加写 | 最后 |
a+ | 可读可写 | 创建 | 否,追加写 | 最后 |
对应的,如果是二进制文件,就都加一个b:‘rb’,‘wb’,‘ab’,‘rb+’,‘wb+’,‘ab+’
2.追加读写
with open(file, 'a+') as f: #追加写操作,没有就创建
f.write("mobile"+'\n') #加\n换行显示
with open 打开使用完后会自动关闭,open打开需要close
with open(file, 'r') as f: #读操作,有中文需添加, encoding='utf-8'参数
line = f.readlines() #读取所有行放在list中
one_line = f.realine() #读取一行的内容
all = f.read() #读取文件的所有内容
with open('a.txt',"r") as f1, open('b.txt', 'w') as f2: #可以同时操作多个文件
for line in f1: #一行行的读
print(line)
四、读写二进制数据pickle
序列化存储可以以python字典,数组,列表等形式保存
import pickle
save = r"./num.pkl" #以pkl后缀存储
list = [1,2,3,4,5,6,7]
with open(save, "wb") as f: #二进制写
pickle.dump(list, f) #序列化存储
path = r"./num.pkl" #读取路径
f1 = open(path, "rb") #二进制读
list = pickle.load(f1) #对数据流进行反序列化读取
f1.close()