Python常用的便捷脚本分享

抽奖名单

这里用到了文件的读取,将读取的数据存放到列表当中,使用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.jpg0001.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.jpg0001.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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾醒(AiXing-w)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值