os是python内置处理文件路径的库,下面我说一下它常用的一些方法
目录
1 返回当前文件所在文件夹路径 os.getcwd()
返回值类型为字符串
import os
a = os.getcwd()
print(a)
print(type(a))
2 文件重命名 os.rename()
第一个参数为文件的老名字,第二个参数为想重命名的名字
- 注:要带上文件尾缀(例:.jpg)与路径
我现在有一张图叫 1.jpg ,我想把它命名为 西红柿.jpg
这个图片在这个地方
import os
old_name = r'C:\Users\MSI\python_help_example\1.jpg'
new_name = r'C:\Users\MSI\python_help_example\西红柿.jpg'
os.rename(old_name,new_name)
3 获取指定路径文件列表 os.listdir()
可以不加参数,不加参数的路径默认为与执行文件相同的路径
import os
doc_list = os.listdir()
print(doc_list)
print(type(doc_list))
也可以加上路径
import os
doc_list = os.listdir(r'C:\Users\MSI\python_help_example')
print(doc_list)
print(type(doc_list))
4 生成路径中的每一级路径的迭代器 os.walk()
我们现在对 1 这个文件夹使用os.walk,1这个文件夹中有2和5两个文件夹与3.txt,6.txt两个文件,2这个文件夹中有4.txt这个文件
import os
all_doc = os.walk(r'C:\Users\MSI\python_help_example\1')
print(all_doc)
print(type(all_doc))
下面我们遍历一下os.walk的结果
for i in all_doc:
print(i)
每一个元素是一个元组,元组中有三个值,第一个值为路径,第二个值为文件夹,第三个值为文件名
上面返回的结果意思是
- 在 C:\Users\MSI\python_help_example\1 这个路径下,有文件夹 '2', '5' ,有文件 '3.txt', '6.txt'
- 在 'C:\Users\MSI\python_help_example\1\2 这个路径下,没有文件夹,有文件 '4.txt'
- 在 C:\Users\MSI\python_help_example\1\5 这个路径下,没有文件夹,也没有文件
5 路径合并 os.path.join()
可以使用两个路径进行合并
import os
a = 'C:\\Users\\MSI\\python_help_example'
b = '1'
c = os.path.join(a,b)
print(c)
print(type(c))
也可以更多
import time
a = 'C:\\Users\\MSI\\python_help_example'
b = '1'
c = '2'
d = os.path.join(a,b,c)
print(d)
print(type(d))
6 常用demo
6.1 提取文件夹下的文件名
import os
import re
path = 'all/'
need_form = True
if not need_form:
p = re.compile(r'(.*)\.')
filename_list = os.listdir(path)
for filename in filename_list:
if need_form:
print(filename)
else:
content = p.findall(filename)[0]
print(content)
这两个都是自带的库,如果需要尾缀保持现在不变就可以了,它的执行结果是这样的
如果不需要尾缀,我们这里改为False
它的运行结果是这样的
上面的re是python的正则,如果想了解的话可以看一下这个 Python 正则表达式_Suyuoa的博客-优快云博客
6.2 批量修改文件名
import os
import re
path = 'all/' # 目标路径
filename_list = os.listdir(path) # 扫描目标路径的文件,将文件名存入列表
a = 0
p = re.compile(r'\..*')
for i in filename_list:
used_name = path + filename_list[a]
form = p.findall(used_name)[0]
new_name = path + str(a) + form
os.rename(used_name,new_name)
print("文件%s重命名成功,新的文件名为%s" %(used_name,new_name))
a += 1
这个是只用os和re,都是python自带的
首先我们搞一个文件夹all
文件夹中是我们要重命名的文件
运行之后是这样的
我们此时的规则是从0开始排,你也可以改变规则,比如搞一个列表
6.3 批量修改图像尺寸
opencv是不能读取中文路径的,所以我们下面用的文件不能使用中文名称,如果用了就会报错
import os
import cv2
files = os.listdir('old/')
for file_name in files:
img = cv2.imread('old/'+ file_name)
img = cv2.resize(img,(256,256))
cv2.imwrite('new/' + file_name,img)
print(file_name,'已完成')
这个是用os和opencv做的,opencv直接pip install opencv-python就可以了,os是python自带的
使用前我们需要创建old和new两个文件夹,我们把要改变的图像放old中,改变完的图像会放在new中
(256,256)是我们要生成的图像大小,.jpg是文件格式,new与old都可以改,我们old中的文件是这样的
运行之后的new中的文件是这样的
6.4 判断文件夹是否存在,如果不存在则创建文件夹
我当前的目录下没有pictures这个文件夹
import os
if not os.path.exists('./pictures'):
os.mkdir('./pictures')
运行之后就有了
6.5 分割训练集和测试集
我现在 JPEGImages中有877张图像,labels中有877个标注文件,标注文件与图像文件同名但尾缀不同
还有一个文件夹dataset
dataset中有images与labels两个文件夹
images与labels中都有train与val这两个文件夹
我现在想把 JPEGImages 文件夹中的随机80%个文件放在 images/train 中,其余放在 images/val 中
我现在想把 labels 文件夹中的随机80%个文件放在 labels/train 中,其余放在 labels/val 中
运行下面的代码就行了,其中random.shuffle()是乱序列表。shutil.copy()是复制文件,第一个参数是复制谁,第二个参数是复制到哪
import os
import shutil
import random
JPEG_list = os.listdir('JPEGImages')
random.shuffle(JPEG_list)
file_number = 0
for i in JPEG_list:
file_name = i.split('.')[0]
if file_number <= len(JPEG_list)*0.8:
shutil.copy('./JPEGImages/' + file_name + '.jpg','./dataset/images/train/' + file_name + '.jpg')
shutil.copy('./labels/' + file_name + '.txt', './dataset/labels/train/' + file_name + '.txt')
else:
shutil.copy('./JPEGImages/' + file_name + '.jpg', './dataset/images/val/' + file_name + '.jpg')
shutil.copy('./labels/' + file_name + '.txt', './dataset/labels/val/' + file_name + '.txt')
file_number = file_number + 1