抽奖名单
这里用到了文件的读取,将读取的数据存放到列表当中,使用random中的sample来从列表中取样本
结合代码来看名单.txt
这个txt文件中的名字是每行一个的,在代码中我们使用sample函数从所有名字中抽取了4个名字
from random import sample
lst = []
with open("名单.txt", 'r', encoding='utf-8') as f:
for name in f.readlines():
lst.append(name.strip())
print(sample(lst, 4))
图片处理
图片调整大小
from PIL import Image
infile = input("源图片:")
outfile = input("目标图片:")
length = int(input("长:"))
width = int(input("宽:"))
img = Image.open(infile)
out = img.resize((length, width), Image.ANTIALIAS)
out.save(outfile)
图片转换类型
import os
path = input("输入图片路径:")
tp = input("输入原来图片类型:")
newtp = input("输入新图片类型:")
imagelist = os.listdir(path)
length = len(tp)
for img in imagelist:
os.rename(os.path.join(path, img), os.path.join(path, img[:-length] + newtp))
图片反色
这里用到了PIL来加载和保存图像,用numpy进行数据的批处理,反色原理其实就是拿整个图片的最大值减去当前的值
from PIL import Image
import numpy as np
name = input("输入名称路径:")
img = Image.open(name)
img = np.array(img)
maxn = img.max()
img = maxn - img
img = Image.fromarray(img)
img.save(name)
图片二值化
功能:将照片二值化
应用场景:受疫情影响有时提交手写版的文件会很不方便,可以用它将写好的文字二值化贴在文档中,这样打印效果与手写无异。
import cv2
import numpy as np
import os
path = input('输入文件夹路径') # 格式如E:/data
for im in os.listdir(path):
print(im)
image = cv2.imread(os.path.join(path, im))
image[image > 150] = 255
image[image <= 150] = 0
cv2.imwrite(os.path.join(path, im), dilation)
图片二值化Plus
有时单纯的二值化后的图像不够理想,这时我们可以可以设置核进行腐蚀和膨胀
import cv2
import numpy as np
import os
path = input('输入文件夹路径') # 格式如E:/data
for im in os.listdir(path):
print(im)
image = cv2.imread(os.path.join(path, im))
image[image > 150] = 255
image[image <= 150] = 0
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(image, kernel)
dilation = cv2.dilate(erosion, kernel)
image = dilation
cv2.imwrite(os.path.join(path, im), dilation)
图片拼接为视频
import numpy as np
import cv2
import os
path = input("输入图片所在的文件夹:")
vpath = input("输入视频要保存的文件夹:")
filestart = input("输入开始图片:")
fileend = input("输入结束图片:")
size = (640,640)
videowrite = cv2.VideoWriter(vpath,-1,20,size)#20是帧数,size是图片尺寸
img_array=[]
for filename in os.listdir(path):#这个循环是为了读取所有要用的图片文件
if filename > filestart:
print(filename)
img = cv2.imread(os.path.join(path, filename))
if img is None:
print(filename + " is error!")
continue
for i in range(1):
videowrite.write(img)
if filename > fileend:
break
videowrite.release()
文件移动
根据一个文件夹中的文件名移动另一个文件夹
import os, shutil
s = input("输入待移动文件夹:")
d = input("输入参照文件夹:")
dtype = input("输入参照文件类型:")
mpath = input("输入要移动到的文件夹:")
ls = os.listdir(s)
ld = os.listdir(d)
print(ld)
for i in range(len(ld)):
if ls[i].split('.')[-2].split('/')[-1]+dtype in ld:
shutil.move(os.path.join(s, ls[i]), os.path.join(mpath, ls[i]))
文件重命名
重命名不同文件夹中的图片和xml文件
功能:将图片路径和xml路径中名字相同的文件安装编号变化重新命名
应用场景:目标检测数据集中命名不规范的问题
import os
src1 = input("图片路径:")
src2 = input("xml路径:")
l1 = os.listdir(src1)
print(l1)
l2 = os.listdir(src2)
t1 = '.' + l1[0].split('.')[-1]
t2 = '.' + l2[0].split('.')[-1]
x = 0
for i in range(len(l1)):
print(l1[i][:-4])
print(l2[i], end=" ")
print(l2[i][:-4])
print()
if l1[i][:-4] == l2[i][:-4]:
name = "%05d" % x
while name + t1 in l1:
x += 1
name = "%05d" % x
while True:
try:
os.rename(os.path.join(src1, l1[i]), os.path.join(src1, name + t1))
os.rename(os.path.join(src2, l2[i]), os.path.join(src2, name + t2))
x += 1
break
except:
x += 1
图片和xml混合状态下的重命名
应用场景和作用与上面的情况类似
import os
src = input("输入路径:")
namelist = os.listdir(src)
i = int(input("输入起始名字:"))
for name in namelist:
if name.split('.')[-1] == 'jpg':
os.rename(os.path.join(src, name), os.path.join(src, "%05d" % i + '.jpg'))
os.rename(os.path.join(src, name[:-4] + '.xml'), os.path.join(src, "%05d" % i + '.xml'))
i+=1
文件删除
删除目录下所有的txt文件
import os
src = input("输入路径:")
for i in os.listdir(src):
if i.split('.')[-1] in ['TXT', 'txt']:
os.remove(os.path.join(src, i))
对比两文件夹并删除其中多余的文件
功能:删除在s1中而不在s2中的文件名对应的文件
注意:这里的比较纯粹比较文件名而不是文件后缀,0001.jpg
和0001.xml
在这里可以看作同一个文件名的文件
用途:在训练目标检测是有些时候数据集会有部分文件缺失,如果缺失的少,其中一种最简单的处理方式就是去掉多出来的部分
import os
s1 = input("输入s1")
s2 = input("输入s2")
s2type = input("输入s2的类型")
l1 = os.listdir(s1)
l2 = os.listdir(s2)
cnt = 0
for i in l1:
if i.split('.')[-2] + ".jpg" not in l2:
print(i)
os.remove(os.path.join(s1, i))
cnt += 1
print(cnt)
删除范围外的文件
前提:文件名为数字并且有规律如
0000.jpg
和0001.jpg
import os
dr = input("输入路径:")
strat = int(input("首地址:"))
end = int(input("尾地址:"))
listdir = os.listdir(dr)
for i in listdir:
if int(i.split('.')[-2]) < strat or int(i.split('.')[-2]) >= end:
os.remove(os.path.join(dr, i))