生成文件目录结构

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

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. java中的垃圾回收算法与垃圾回收器

    常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的 ...

  2. 一篇文章带你了解轻量级Web服务器——Nginx简单入门

    一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...

  3. JS中数值类型的本质

    一.JS中的数值类型 众所JS爱好友周知,JS中只有一个总的数值类型--number,它包含了整型.浮点型等数值类型.其中,浮点数的实现思想有点复杂,它把一个数拆成两部分来存储.第一部分是有效位数,也 ...

  4. 二、docker安装

    一.docker安装 Docker 是管理容器的工具, Docker 不等于 容器. 1.1.docker yum源设置 #step 1 download docker-ce.repo file [r ...

  5. 谷歌拼音自带lua

    function fast_string_banji(argument) return {"快捷1", "快捷2", "快捷3", &quo ...

  6. 上下文管理器 context managet

    定义:实现了上下文管理协议的对象,主要用于保存和恢复各种全局状态,关闭文件等,它本身就是一种装饰器. with语句 with语句就是为支持上下文管理器而存在的

  7. (译)TDD(测试驱动开发)的5个步骤

    原文:5 steps of test-driven development https://developer.ibm.com/articles/5-steps-of-test-driven-deve ...

  8. JAVA缓存规范 —— 虽迟但到的JCache API与天生不俗的Spring Cache

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 有诗云"纸上得来终觉浅,绝知 ...

  9. I Love Big Numbers !(高精度)

    题目链接 题意: 多组数据输入也就是C++中的: int n; while (cin >> n) { 代码块 } 对于每个数据输出其阶乘的各位上的数字之和.大眼一看,没有思路,那就百度把. ...

  10. 通过docker部署grafana和mysql

    阅读本文需要一定的Linux, Docker与MySQL知识, 例如: 会启动容器, 进入容器; 会创建表, 会使用INSERT语句, 会使用SELECT语句... 1. 简介 2. 网络设置 - 2 ...