python的N個小功能(找到符合要求的圖片,重命名,改格式,縮放,進行隨機分配)


##########################################################################

循環讀取該目錄下所有子目錄和子文件

#########################################################################

import os

import os.path

 

def directory(rootdir):                                  # 指明被遍歷的文件夾

         for parent,dirnames,filenames in os.walk(rootdir):   #三個參數:分別返回1.父目錄 2.所有文件夾名字(不含路徑) 3.所有文件名字

                

             for dirname in  dirnames:                        #輸出文件夾信息

                 print "parent is:" + parent

                 print "dirname is:" + dirname

 

             for filename in filenames:                      

                 print "parent is:" + parent                  #輸出文件夾信息

                 print "filename is:" + filename              #輸出文件信息

                 print "the full name of the file is:" + os.path.join(parent,filename)  #輸出文件路徑信息

 

directory('G:\\test')

 

###############################################################################

保存圖片//修改圖片長寬比情況

###############################################################################

from PIL import Image

 

def modifysize(infile,outfile):    #輸入文件,輸出文件  

         im = Image.open(infile)

         (x,y) = im.size                #read image size,讀取文件大小

         x_s = 600                                         #define standard width,定義標准

         y_s = 600                                              #calc height based on standard width

         out = im.resize((x_s,y_s),Image.ANTIALIAS)                   #resize image with high-quality

         out.save(outfile)

 

modifysize(' G:\\test\\one.jpg ', ' G:\\TEST\\one.jpg ')

 

from PIL import Image

def save(infile,outfile):    #輸入文件,輸出文件  

         im = Image.open(infile)

         (x,y) = im.size                #read image size,讀取文件大小

         x_s = x                                                   #define standard width,定義標准

         y_s = y                                         #calc height based on standard width

         out = im.resize((x_s,y_s),Image.ANTIALIAS)                   #resize image with high-quality

         out.save(outfile)

 

########################################################################

對文件夾中所有文件重命名函數

########################################################################

####################原來函數############################################

import os

def rename():

         path=r'G:\TEST'

         filelist=os.listdir(path)#該文件夾下所有的文件(包括文件夾)

         for files in filelist:#遍歷所有文件

                   Olddir=os.path.join(path,files);#原來的文件路徑

                   if os.path.isdir(Olddir):#如果是文件夾則跳過

                            continue;

                   filename=os.path.splitext(files)[0];#文件名

                   filetype=os.path.splitext(files)[1];#文件擴展名

                   Newdir=os.path.join(path,filename[0]+filetype);#新的文件路徑

                   os.rename(Olddir,Newdir);#重命名

 

rename()

#####################修改后函數###########################################

 

import os

def rename(path,foldername):         #傳入路徑和文件夾名

         if len(foldername)!=5 and not(foldername.isdigit()):           #傳入文件夾名是五位數的且字符串全為數值,不符合跳過

                   return

         filelist=os.listdir(path)#該文件夾下所有的文件(包括文件夾)

         i=0

         for files in filelist:#遍歷所有文件

                   Olddir=os.path.join(path,files);#原來的文件路徑

                   if os.path.isdir(Olddir):#如果是文件夾則跳過

                            continue;

                   filename=os.path.splitext(files)[0];#文件名

                   filetype=os.path.splitext(files)[1].lower();#文件擴展名

                   if filetype!='.jpg':

                            filetype='.jpg'

 

                   number='%d' %i

                   Newdir=os.path.join(path,foldername+number+filetype);#新的文件路徑,新名稱命名規則

                   os.rename(Olddir,Newdir);#重命名

                   i=i+1

 

rename('G:\\TEST\\20010','20010')

 

 

###############################################################

#########################################################################

實現查找__過濾掉不需要的__修改大小寫功能(每個文件一行一行讀取)

#########################################################################

# -*- coding: utf-8 -*-

"""

Created on Fri Feb 17 20:25:05 2017

 

@author: who

"""

 

import chardet

import os

import os.path

import re

import random

import string

 

rootdir=r'G:\TEST'

 

from PIL import Image

 

################保存圖片,從一個文件夾到另一個文件夾##############

def save(infile,outfile):    #輸入文件,輸出文件  

         im = Image.open(infile)

         (x,y) = im.size                #read image size,讀取文件大小

         x_s = x                                                   #define standard width,定義標准

         y_s = y                                         #calc height based on standard width

         out = im.resize((x_s,y_s),Image.ANTIALIAS)                   #resize image with high-quality

         out.save(outfile)

 

################過濾掉不需要的,修改大小寫功能#####################

for parent, dirnames, filenames in os.walk(rootdir):   # 三個參數:分別返回1.父目錄 2.所有文件夾名字(不含路徑) 3.所有文件名字

 

 

         try:

                   for filename in filenames:

 

                            filenamepre=os.path.splitext(filename.decode("gbk"))[0];#文件名前綴

                            filetype=os.path.splitext(filename.decode("gbk"))[1].lower();#文件擴展名

 

                            pswpath = os.path.join(parent, filename.decode("gbk"));

                            tmppath = os.path.join(r'G:\test',filename.decode("gbk")) #寫到另一個文件夾#

                            if filetype=='XXX':                      ####符合類型的文件####

                                    

                                     tmp_file = open(tmppath, "w")

                                     with open(pswpath) as f:

                                         lines = f.readlines()            

 

                                         for line in lines:                  ####一行一行讀取 ####  

                                                   if line.find('aaa') > -1:         ####過濾掉含有aaa的這行####

                                                       continue

                                                   if line.find('CCC')>-1:          ####將含有CCC這行小寫化####

                                                            tmp_file.write(line.lower())

                                                   else:

                                                            tmp_file.write(line)

                                      

                                     tmp_file.close()

 

                                    

                            else:

                                     save(pswpath,tmppath);

         except IOError:

                   pass

 

#############################################################################

將所有文件所有文件名記錄下來,進行隨機分配

############################################################################

# -*- coding: utf-8 -*-

"""

Created on Fri Feb 17 15:53:34 2017

 

@author: who

"""

 

# -*- coding: utf-8 -*-

"""

Created on Wed Feb 15 18:07:03 2017

 

@author: Administrator

"""

 

import chardet

import os

import os.path

import re

import random

import string

 

from PIL import Image

 

rootdir=r'G:\TEST';    # 指明被遍歷的文件夾

 

dict={};

dictfileold={};

dictfileoldfile={};

dictparent={};

dir={}

i=0;

 

for parent,dirnames,filenames in os.walk(rootdir):         #三個參數:分別返回1.父目錄 2.所有文件夾名字(不含路徑) 3.所有文件名字

         j=0

         try:          

                   for filename in filenames:                         #輸出文件信息

                            filenamepre=os.path.splitext(filename)[0];     #文件名前綴

                            filetype=os.path.splitext(filename)[1].lower();#文件擴展名

                            tmpstr=parent.rsplit('\\')

 

                            fulloldname=os.path.join(parent,filename);

                            dict[filenamepre]=i;                           #舊名稱為key

                            dictfileold[i]=fulloldname;                    #舊路徑名稱為value  

                            dictfileoldfile[i]=filenamepre;                #舊文件名為value                      

                            dictparent[i]=parent;

                            dir[i]=tmpstr[-1]                              #得到上一級目錄

                            i=i+1;

                            j=j+1;

         except IOError:

                   pass

 

##############文件數,進行隨機分配##########################################

foldernum=i;                                             

randomnum=range(foldernum);

random.shuffle(randomnum);

trainnum=int(foldernum*0.7);

 

train=open(r'G:\train.txt','w')

val=open(r'G:\val.txt','w')

trainval=open(r'G:\trainval.txt','w')

 

for j in range(0,foldernum):

         trainval.write(dictfileoldfile[j])

         trainval.write('\n')

         if j in randomnum[0:trainnum]:

                   train.write(dictfileoldfile[j])

                   train.write('\n')

         else:

                   val.write(dictfileoldfile[j])

                   val.write('\n')

 

train.close()

val.close()

trainval.close()

 

############################################################################

找到符合要求的文件,進行隨機分配

  • 編號要以6為數字命名,例如000034.jpg
  • 圖片要是JPEG/JPG格式的,PNG之類的需要自己轉換下
  • 圖片的長寬比(width/height)要在0.462-6.828之間,就是太過瘦長的圖片不要

############################################################################

# -*- coding: utf-8 -*-

"""

Created on Wed Feb 15 18:07:03 2017

 

@author: Administrator

"""

 

import chardet

import os

import os.path

import re

import random

import string

 

from PIL import Image

 

def save(infile,outfile):    #輸入文件,輸出文件  

         im = Image.open(infile)

         (x,y) = im.size                #read image size,讀取文件大小

         x_s = x                                                   #define standard width,定義標准

         y_s = y                                         #calc height based on standard width

         out = im.resize((x_s,y_s),Image.ANTIALIAS)                   #resize image with high-quality

         out.save(outfile)

 

 

def modifysize(infile,outfile):    #輸入文件,輸出文件

         try:                           #過濾掉任意的異常

                   im = Image.open(infile)

         except :

                   return 0

 

         (x,y) = im.size                #read image size,讀取文件大小

         x_s = 800                                         #define standard width,定義標准

         y_s = 600

         try:                                            #過濾掉任意的異常

             out = im.resize((x_s,y_s),Image.ANTIALIAS)                  

         except :

             return 0

         out.save(outfile)

         return 1

        

rootdir=r'E:\TEST';             # 指明被遍歷的文件夾

 

dict={};

dictfilenew={};

dictfileold={};

dictfilenewname={};

dictparent={};

dir={}

i=0;

 

for parent,dirnames,filenames in os.walk(rootdir):         #三個參數:分別返回1.父目錄 2.所有文件夾名字(不含路徑) 3.所有文件名字

         j=0

         try:          

                   for filename in filenames:                                      #輸出文件信息

                            if((re.search(u'XXX',filename.decode("gbk"))==None):   #找到符合要求文件名

                                     continue;

                            filenamepre=os.path.splitext(filename.decode("gbk"))[0];#文件名前綴

                            filetype=os.path.splitext(filename.decode("gbk"))[1].lower();#文件擴展名

                            if (filetype!='.jpg' and filetype!='.png'):        ##符合相應后綴的圖片

                                     continue;

                            tmpstr=parent.rsplit('\\')

                            print u"上層目錄:"+tmpstr[-1]

 

                            if len(tmpstr[-1])!=5 or not(tmpstr[-1].isdigit()):           #傳入文件夾名是五位數的且字符串全為數值,不符合跳過

                                     continue

                            fullname=os.path.join(parent,filename.decode("gbk"));

 

                            if filetype!='.jpg':

                                     filetype='.jpg'

 

 

                            number='%d' %j

                            Newname=tmpstr[-1]+number+filetype

                            Newdir=os.path.join(parent,tmpstr[-1]+number+filetype);              #新的文件路徑,新名稱命名規則

 

                            fullnewname=os.path.join(parent,Newname.decode("gbk"));       #將所有新路徑名稱,舊路徑名稱,新名稱,舊名稱,上一級目錄都用字典保存

                            fulloldname=os.path.join(parent,filename.decode("gbk"));

                            dict[fullnewname]=i;        #新路徑名稱為key                         

                            dictfilenew[i]=fullnewname;  #新路徑名稱為value

                            dictfileold[i]=fulloldname;   #舊路徑名稱為value                         

                            dictfilenewname[i]=Newname.decode("gbk");  #新名稱為value

                            dictparent[i]=parent;

                            dir[i]=tmpstr[-1]

                            i=i+1;

                            j=j+1;

         except IOError:

                   pass

 

###########################將所有文件隨機分配##################################

foldernum=i;

randomnum=range(foldernum);

random.shuffle(randomnum);

trainnum=int(foldernum*0.8);

 

for j in range(0,foldernum):

         if j in randomnum[0:trainnum]:

                   outfile=os.path.join(r'E:\train',dictfilenewname[j])

                   modifysize(dictfileold[j],outfile)

         else:

                   outfile=os.path.join(r'E:\test',dictfilenewname[j])

                   modifysize(dictfileold[j],outfile)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM