对此次项目中主要涉及到的内容做以下说明:
1、需要收集大量资料(包括收集不同信息和图片);
2、资料太多需要做同样的操作处理(包括修改文件名和修改图片尺寸)。
一、修改文件名
import os
os.listdir #获取文件夹内文件名
os.rename #更改文件名
用到的库和基本用法如上,因为需要获取大量资料,可能会用到H5等相关小程序来作为收集资料的方法。以问卷星为例,在获取并下载资料后可以发现:
1、文件中的图片是以网址的形式存在;
2、图片名都是以自有网站设定的文件名存在。
(这是文件中的图片网址)
(这是自由网站设定的文件名)
仔细去发现,你可以找到二者的相同序列,以此为思路,设立字典,将对应的文件名替换成键值,就是这次批量修改文件名的思路。
import os
import xlrd
import logging
'''
将图片设定为指定尺寸,并且总体图片内容不变形
设定的尺寸为:750*315
'''
# image_size_h = 315 # 设定宽
# image_size_w = 750 # 设定长
source_path = "E:\\IT_demand_picture\\" # 源文件路径
target_path = "E:\\IT_picture\\s\\" # 输出目标文件路径
file_S = xlrd.open_workbook('20220228.xlsx','r') # 打开文件
if not os.path.exists(target_path): # 如果没有存在目标文件,则创建目录
os.makedirs(target_path)
image_list = os.listdir(source_path) # 获取当前文件夹中的文件名
def filename_revise(file,path):
sht = file.sheets()[0] # 获取子工作表
row1 = sht.row_values(1) # 查看每行数据
start = 1
nrows = sht.nrows # 获取数据行数
files = os.listdir(path)
def getDictKey_1(dic,value): # 取值对应的键放到文件名中
va = [k for k,v in dic.items() if v == value]
for i in va:
return i
for i in range(start,nrows):
urls = {}
shop_name = sht.cell(i,6).value # 取excel其中一列的值
for j in range(18,25): # 这是图片地址在文件中保存的位置
url = sht.cell(i,j).value
logging.info(url)
url_n = url.split('_')[-1].split('&')[0]
urls[shop_name+str(j-17)] = url_n
for file in files: #通过文件名和excel得到的url地址相同序列去做判定,相同则批量修改文件名并保存
indexf = file.split('_')[-1]
for url in urls.values():
if indexf == url:
os.rename(path+file,path+getDictKey_1(urls,url)+'.jpg')
filename_revise(file_S,source_path)
二、批量修改图片尺寸(改变尺寸同时图片不变形)
import cv2
cv2.copyMakeBorder #给图片设置边界框
cv2.imread #读取文件(注意读取的文件路径必须为英文)
cv2.resize #修改图片大小
cv2.imwrite #保存图片
用到的库和用法如上,需要注意的是使用imread读取文件时路径一定要为英文,否则会报错。
保证图片不变形的情况去修改尺寸思路是这样的,首先先缩放到height或者是width最大的那边,这取决于图片是横图还是竖图,缩小尺寸后按照另外较小的那方尺寸进行切图,这样就能保证图片清晰不变形,并且符合图片尺寸要求。
def resize_size(image,scale_size):
# top,bottom,left,right = (0,0,0,0)
h,w = image.shape[0],image.shape[1]
scale = max(h,w)/scale_size # 根据边框最大值计算比例
new_w,new_h = int(w/scale),int(h/scale)
resize_img = cv2.resize(image,(new_w,new_h))
if new_w % 2 != 0 and new_h % 2 == 0: #填充至scale_size * scale_size中
top, bottom, left, right = (scale_size-new_h)/2, (scale_size-new_h)/2, (scale_size-new_w)/2 + 1, (scale_size-new_w)/2
elif new_h % 2 != 0 and new_w % 2 == 0:
top, bottom, left, right = (scale_size-new_h)/2 + 1, (scale_size-new_h)/2, (scale_size-new_w)/2, (scale_size-new_w)/2
elif new_h % 2 == 0 and new_w % 2 == 0:
top, bottom, left, right = (scale_size-new_h)/2, (scale_size-new_h)/2, (scale_size-new_w)/2, (scale_size-new_w)/2
else:
top, bottom, left, right = (scale_size-new_h)/2 + 1, (scale_size-new_h)/2, (scale_size-new_w)/2 + 1, (scale_size-new_w)/2
pad_img = cv2.copyMakeBorder(resize_img, int(top), int(bottom), int(left), int(right), cv2.BORDER_CONSTANT, value=[255,255,255]) # 设定图片框架
pad_img_cut = pad_img[217:532,0:730] # 需调整参数,以达到切图效果
return pad_img_cut
i = 0
for file in image_list: # 对不同文件格式进行判断,并修改成所需要的同样文件格式
if '.jpg' in file:
image_source = cv2.imread(source_path + file) # 读取图片
image = resize_size(image_source ,750) # 缩放裁剪尺寸
cv2.imwrite(target_path + file, image) # 重命名并且保存
elif '.png' in file:
file = file.replace('png','.jpg')
image_source = cv2.imread(source_path + file) # 读取图片
image = resize_size(image_source ,750) # 缩放裁剪尺寸
cv2.imwrite(target_path + file, image) # 重命名并且保存
elif '.jpeg' in file:
file = file.replace('jpeg','.jpg')
image_source = cv2.imread(source_path + file) # 读取图片
image = resize_size(image_source ,750) # 缩放裁剪尺寸
cv2.imwrite(target_path + file, image) # 重命名并且保存
else:
pass
此次批量处理文件就此完成,重要在于思路!
一位在职数据分析师,每个地方都有数据存在!