[python] 个人日常python工具代码
文章目录
生成文件目录结构
生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下:
root:[z:/]
|--a.py
|--image
| |--cat1.jpg
| |--cat2.jpg
| |--cat3.jpg
| |--cat4.jpg
| |--cat5.jpg
| |--cat6.jpg
|--result
| |--result.jpg
|--save.txt
|--test.py
参考
https://blog.csdn.net/feizai1208917009/article/details/88396501
代码如下:
import os
import os.path
# 结果保存路径
txtFilePath="save.txt"
savetxtFile = open(txtFilePath, 'w',encoding='utf-8')
# 文件查找路径
findFilePath="z:/"
# 是否只显示目录
isShowDir = False
# 最大子目录文件深度
maxDepth = 3
# 需要跳过的文件目录和文件
skipFile = [".git","doc"]
# 需要跳过的文件类型
#skipFileType = [".txt",".MOV"]
skipFileType=[]
def saveFile(depth,item):
# 保存的内容
saveCotent="| " * depth + "|--" + item
print(saveCotent)
savetxtFile.write( saveCotent)
savetxtFile.write("\n")
def listDir(path, depth):
# 获得绝对路径
absPath=os.path.abspath(path)
if depth == 0:
print("root:[" + path + "]")
savetxtFile.write("root:[" + path + "]")
savetxtFile.write("\n")
# 超过最大深度
if depth > maxDepth:
return
# 展开目录文件
for item in os.listdir(path):
# 跳过指定的文件目录和文件
if item not in skipFile:
# 跳过指定的后缀文件
if os.path.splitext(item)[1] in skipFileType:
continue
# 获得项目绝对目录地址
absItem=os.path.join(absPath,item)
# 是否只显示目录
if isShowDir is True:
if os.path.isdir(absItem) is True:
saveFile(depth,item)
else:
saveFile(depth,item)
# 查找子项
if os.path.isdir(absItem):
listDir(absItem, depth +1)
if __name__ == '__main__':
listDir(findFilePath, 0)
savetxtFile.close()
多图合并
将多图合并为一张图像,并添加图像对应文字,效果如下:
参考
https://blog.csdn.net/qq_37598011/article/details/101551593
https://cloud.tencent.com/developer/ask/204503
代码如下:
import os
import numpy as np
from PIL import ImageFont, ImageDraw, Image
# 创建字体文件
# 文字名
def creat_font_img(value):
# 设置空白图像
img = Image.new('RGB', (TEXTWIDTH, TEXTHEIGHT), "white")
# 设置需要显示的字体 宋体
fontpath = TEXTFONT
# 32为字体大小
font = ImageFont.truetype(fontpath, TEXTSIZE)
# 绘图
img_pil = img
draw = ImageDraw.Draw(img_pil)
# 获取字体宽度
sum_width = 0
sum_height = 0
# 添加文字
for char in value:
width, height = draw.textsize(char, font)
sum_width += width
sum_height = height
# 绘制文字信息
# 文字居中
draw.text(((img_pil.size[0] - sum_width) / 2, (img_pil.size[1] -
sum_height) / 2 + TEXTOFFSET), value, font=font, fill=(0, 0, 0))
return img_pil
# 创建单个带标题和图像的文字
def create_single_img(path):
# 提取图片
img = Image.open(path)
# 提取图像名
text = img.filename.split(".")[0]
imgFont = creat_font_img(text)
# 图像大小重置
img = img.resize((IMGWIDTH, IMGHEIGHT))
# 合并的图像
mergeImg = Image.new(
"RGB", (IMGWIDTH+IMAGESPACE, IMGHEIGHT+TEXTHEIGHT), "white")
mergeImg.paste(imgFont, (0, 0))
# 贴图
mergeImg.paste(img, (0, TEXTHEIGHT))
return mergeImg
def create_multi_img(dirpath):
# 转到工作目录
os.chdir(dirpath)
mergeImgs = []
for dirname in os.listdir(dirpath):
if dirname.split(".")[-1] == 'jpg':
# print(dirname)
mergeImgs.append(create_single_img(dirname))
if ROW*COL is not len(mergeImgs):
print("错误,请检查图像数量")
# 单个图像尺寸
mergeW, mergeH = mergeImgs[0].size
finalImg = Image.new("RGB", (mergeW*COL, mergeH*ROW), "white")
# 第几张图
num = 0
# 排列图像
for top in range(0, mergeH*ROW, mergeH):
for left in range(0, mergeW*COL, mergeW):
#print(left, top)
finalImg.paste(mergeImgs[num], (left, top))
num = num+1
return finalImg
# -----------------
# 全局变量
# 图片排列方式
ROW = 3
COL = 2
# 单个图像大小
IMGWIDTH, IMGHEIGHT = 600, 600
# 图像间距
IMAGESPACE = 10
# 文字图像尺寸 文字图像宽需要与单张输入图像等宽
TEXTWIDTH, TEXTHEIGHT = IMGWIDTH, 100
# 文字大小和文字上下偏移量
TEXTSIZE, TEXTOFFSET = 64, 5
# 文字字体名
# simsun宋体, msyh.ttc微软雅黑
TEXTFONT = "font/msyh.ttc"
if __name__ == '__main__':
finalImg = create_multi_img("./")
# 保存图像
finalImg.save("result.jpg", dpi=(300.0, 300.0))
找出文件夹中相似图像
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 8 06:18:17 2021
@author: luohenyueji
"""
import threading
import time
import queue
import cv2
import os
import numpy as np
import cv2
import shutil
import numpy as np
import os
# 计算hash值
def consume(thread_name, q, result):
while True:
filename, img = q.get()
phash_value = cv2.img_hash.PHash_create().compute(img)
result[str(filename)] = phash_value
q.task_done()
# 读取图像
def produce(thread_name, q, imgPath):
for i in os.listdir(imgPath):
if i.split('.')[-1] == 'jpg':
filename = os.path.join(imgPath, i)
imgfile = cv2.imread(filename)
if imgfile is None:
continue
q.put([filename, imgfile])
print(filename)
q.join()
# 结果
result = {}
imgpath = "save"
q = queue.Queue()
p = threading.Thread(target=produce, args=("producer", q, imgpath))
c1 = threading.Thread(target=consume, args=("consumer1", q, result))
c2 = threading.Thread(target=consume, args=("consumer2", q, result))
c3 = threading.Thread(target=consume, args=("consumer3", q, result))
c4 = threading.Thread(target=consume, args=("consumer4", q, result))
c1.setDaemon(True)
c2.setDaemon(True)
c3.setDaemon(True)
c4.setDaemon(True)
p.start()
c1.start()
c2.start()
c3.start()
c4.start()
p.join()
np.save("file.npy", result)
filehash = np.load('file.npy', allow_pickle=True).item()
save_file = "save_similar"
os.makedirs(save_file, exist_ok=True)
# pash计算结构
phash_create = cv2.img_hash.PHash_create()
# 阈值
pash_thre = 10
while (len(filehash)):
# 取keys
now_keys = list(filehash.keys())[0]
# 还剩多少图片
print("还剩{}图片".format(len(filehash.keys())))
now_keys_value = filehash.pop(now_keys)
# 相同图像存储
similar_filename = []
# 循环计算值
for keys in filehash:
pash_value = phash_create.compare(now_keys_value, filehash[keys])
if pash_value < pash_thre:
similar_filename.append(keys)
try:
# 移动图像
if len(similar_filename) > 0:
# 获得关键key名字
now_keys_filename = os.path.basename(now_keys)
# 创建的保存文件路径
save_file_path = os.path.join(save_file, now_keys_filename[:-4])
os.makedirs(save_file_path, exist_ok=True)
# 移动关键keys图片
shutil.move(now_keys,os.path.join(save_file_path,now_keys_filename))
# 从字典中移除值,并移动图片
for i in similar_filename:
filehash.pop(i)
# 获得key名字
keys_filename = os.path.basename(i)
# 移动图片
shutil.move(i, os.path.join(save_file_path, keys_filename))
except:
continue
[python] 个人日常python工具代码的更多相关文章
- Python趣味实用小工具
代码地址如下:http://www.demodashi.com/demo/12918.html python 趣味实用小工具 概述 用python实现的三个趣味实用小工具: 图片转Execl工具 , ...
- python 练习(一)代码统计工具的实现
最近部门成立了一个python学习小组,旨在让大家在做项目中开始成长起来,于是老大就给布置了第一个小任务:代码统计工具,具体的需求如下: 需求: . 能够统计指定目录下C++程序的代码行数. . C+ ...
- python制作命令行工具——fire
python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...
- python开源项目及示例代码
本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...
- python开源项目及示例代码(转)
本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...
- Python使用Plotly绘图工具,绘制直方图
今天我们再来讲解一下Python使用Plotly绘图工具如何绘制直方图 使用plotly绘制直方图需要用到graph_objs包中的Histogram函数 我们将数据赋值给函数中的x变量,x = da ...
- Python使用Plotly绘图工具,绘制面积图
今天我们来讲一下如何使用Python使用Plotly绘图工具,绘制面积图 绘制面积图与绘制散点图和折线图的画法类似,使用plotly graph_objs 中的Scatter函数,不同之处在于面积图对 ...
- Python使用Plotly绘图工具,绘制饼图
今天我们来学习一下如何使用Python的Plotly绘图工具,绘制饼图 使用Plotly绘制饼图的方法,我们需要使用graph_objs中的Pie函数 函数中最常用的两个属性values,用于赋值给需 ...
- Python交互K线工具 K线核心功能+指标切换
Python交互K线工具 K线核心功能+指标切换 aiqtt团队量化研究,用vn.py回测和研究策略.基于vnpy开源代码,刚开始接触pyqt,开发界面还是很痛苦,找了很多案例参考,但并不能完全满足我 ...
随机推荐
- 自己动手写ls命令——Java版
自己动手写ls命令--Java版 介绍 在前面的文章Linux命令系列之ls--原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls ...
- Java 求解自幂数(水仙花数)
什么是自幂数 如果在一个固定的进制中,一个 n 位自然数等于自身各个数位上数字的 n 次幂之和,则称此数为自幂数. 例如:在十进制中,153 是一个三位数,各个数位的3次幂之和为 1^3+5^3+3^ ...
- WiresShark
WireShark 分析数据包技巧 确定WireShark的位置[是否在公网上] 选择捕获接口,一般都是internet网络接口 使用捕获过滤器 使用显示过滤器[捕获后的数据包还是很复杂,用显示过滤器 ...
- C++ 函数重载解析策略
参考<C++ Primer Plus>(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社.C++ 使用重载解析策略来决定为函数调用使用哪一个函数定义.重载解 ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- Oracle数据泵导入dmp文件,报ORA-39083、ORA-01917错误解决办法
将10.16.23.111数据库服务器中的数据库名称为cwy_init1的数据导出,随后在10.16.23.112数据库服务器创建空库cwy_init2,将导出的cwy_init1数据文件(cwy_i ...
- Vue2 到 Vue3,重温这 5 个常用的 API
距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...
- zabbix-钉钉报警部署
zabbix-钉钉报警部署 1. 流程说明 申请钉钉机器人 获取Webhook配置安全设置 获取钉钉号 使用脚本(shell/python)调用钉钉接口: python 输入收件人 信息 配置发件人 ...
- 操作系统课程设计pintos project1实验摘记
第一部分 项目概述 一.Pintos简介 Pintos是一个基于80x86架构的简单操作系统框架,它支持内核级线程.能够加载和运行用户程序,也拥有文件系统,不过,这些功能均以一种简单的形式实现. 二. ...
- MobaXterm/Xshell快速命令宏配置
背景:使用MobaXterm或者Xshell连接远程服务器时,添加常用的命令宏一键执行,能提高效率节约时间. 使用方法: MobaXterm: 1)左边菜单栏->Macros->Recor ...