生成文件目录结构

生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下:

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工具代码的更多相关文章

  1. Python趣味实用小工具

    代码地址如下:http://www.demodashi.com/demo/12918.html python 趣味实用小工具 概述 用python实现的三个趣味实用小工具: 图片转Execl工具 , ...

  2. python 练习(一)代码统计工具的实现

    最近部门成立了一个python学习小组,旨在让大家在做项目中开始成长起来,于是老大就给布置了第一个小任务:代码统计工具,具体的需求如下: 需求: . 能够统计指定目录下C++程序的代码行数. . C+ ...

  3. python制作命令行工具——fire

    python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...

  4. python开源项目及示例代码

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  5. python开源项目及示例代码(转)

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  6. Python使用Plotly绘图工具,绘制直方图

    今天我们再来讲解一下Python使用Plotly绘图工具如何绘制直方图 使用plotly绘制直方图需要用到graph_objs包中的Histogram函数 我们将数据赋值给函数中的x变量,x = da ...

  7. Python使用Plotly绘图工具,绘制面积图

    今天我们来讲一下如何使用Python使用Plotly绘图工具,绘制面积图 绘制面积图与绘制散点图和折线图的画法类似,使用plotly graph_objs 中的Scatter函数,不同之处在于面积图对 ...

  8. Python使用Plotly绘图工具,绘制饼图

    今天我们来学习一下如何使用Python的Plotly绘图工具,绘制饼图 使用Plotly绘制饼图的方法,我们需要使用graph_objs中的Pie函数 函数中最常用的两个属性values,用于赋值给需 ...

  9. Python交互K线工具 K线核心功能+指标切换

    Python交互K线工具 K线核心功能+指标切换 aiqtt团队量化研究,用vn.py回测和研究策略.基于vnpy开源代码,刚开始接触pyqt,开发界面还是很痛苦,找了很多案例参考,但并不能完全满足我 ...

随机推荐

  1. String内建函数

    int length():返回字符串的长度: return value.lengthchar charAt(int index): 返回某索引处的字符return value[index]boolea ...

  2. 在vue中引入elementui

    文章目录 1.下载安装 2.在main.js中引入 3.可以根据封装好的组件自行调用 官网地址:https://element.eleme.cn/#/zh-CN 1.下载安装 npm i elemen ...

  3. 三、Kubernetes调度

    一.Kubernetes调度 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: 公平:如何保证每个节点都 ...

  4. RAID5部署

    软RAID与备份盘 1.此处我们还用刚才的4块盘做演示,三块盘做raid,一块盘做备份盘,防止磁盘故障 我们以raid 5 来配置三块磁盘 加上一块备份盘 [root@local-pyyu tmp]# ...

  5. 我的 React 最佳实践

    There are a thousand Hamlets in a thousand people's eyes. ----- 威廉·莎士比亚 免责声明:以下充满个人观点,辩证学习 React 目前开 ...

  6. MongoDB 数据库的学习

    一.MongoDB的简介 1.MongoDB是什么? MongoDB 是由 C++ 语言编写的,基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,是最接近于关系型数据库的 No ...

  7. srcddd

    目录 application assembler UserReq.go UserRsp.go dto MessageResult.go UserDTO.go services UserService. ...

  8. linux ip命令

    ip link show # 显示网络接口信息 ip link set eth0 up # 开启网卡 ip link set eth0 down # 关闭网卡 ip link set eth0 pro ...

  9. centos7 redis6.2.6安装

    1. 源码包下载并解压 wget http://download.redis.io/releases/redis-6.2.6.tar.gz tar -zxvf redis-6.2.6.tar.gz 2 ...

  10. Spring Boot中@Import三种使用方式!

    需要注意的是:ImportSelector.ImportBeanDefinitionRegistrar这两个接口都必须依赖于@Import一起使用,而@Import可以单独使用. @Import是一个 ...