蛋蛋说我写的博客叫做情感博客,所以现在不忍心,出来水一篇,毕竟为了庆祝十一月的到来。
十一月有周杰伦的新专辑,当时我们买了藏在书包里,开运动会,一本漫画,一副耳机,躺在绿油油的草地上,哎,小姐,请问有没有卖半岛铁盒,走廊灯关上,恩恩听不清,我走到窗边书包放。。。。
感觉这些就是整个世界。
这个其实叫做写在前面的话,因为现在是十一月的第一天,小时候超级喜欢十一月,因为每个运动会都会开在十一月,然后昆明的十一月的气候超级好,天空很蓝,空气微微冷。每次开运动会都可以偷偷跑出学校门口买好吃的。小伙伴会把自己家的狗狗带到学校,spirit我还记得她的狗狗叫做这个名字。
小时候我可是运动健将,因为没有人的仰卧起坐能够比过我,跳远也很厉害,然后每次都可以拿奖。但是拿奖的时候总是很尴尬,因为我的名字很少见,主持人喜欢把我的名字分开念,生气。我还记得杨龙当时笑的嘴都快裂开了。大家全部笑的趴在地上,生气!!!
哈哈,好的开始写技术部分,今天的内容叫做批处理修改文件的名字。当然我们是不可能讲这么简单的东西的,只是通过这个简单的东西我们讲怎么一点点的改进自己的代码,实现代码的高效复用,也就是传说中的造轮子。把自己的代码改造的更加的完备。更加的实用,写一些值得收藏的代码。
假设我们有一批文件经过某些加工之后名字变了,但是我们想按照自己的意愿改名字,在Python中给我们提供了一个强大的轮子,叫做os.rename(oldname,newname)
通过调用这个函数呢,我们可以轻易的实现改名字。
比如说在某个文件夹的下面我们存在着一些文件,就像上面这张图片一样,在-前面的是我们文件本来的名字,经过了某些处理之后我们的文件变成了上面的这个样子,我们只想保留文件原来的名字,就像下面这张图一样。这个时候我们就需要做一个批处理,来修改我们这些文件的名字。
使得它们变成上面的这个样子。
根据需要的需求,我们可以设计出我们的实现思路。
1.我们发现我们只要“-”这个符号前面的文件名,之后在加上文件的文件类型,后缀,那么就是我们文件最终的名字。
2.我们知道文件的名字其实是字符串,在字符串中我们可以根据split() 这个函数来进行分割,我们根据split("-")
这个函数得到的是一个List,我们只需要去List的第一个元素就是我们文件名,之后加上后缀,然后使用我们Python自带的函数,我们就可以实现文件名的重新命名。
3.其实我之前写过一个类似的功能,就是从APK中提取出我们的classes.dex文件和我们的so文件
那个难度比这个大一点。我们用到了zip文件的读取和写入,当然还有其他的实现思路。
讲完了我们的运用场景,实现思路,是不是觉得我们的代码实现会比较简单呢。OK,那么我们就来写一个简单的代码。
代码复制版本:
#!/usr/bin/env python
# coding=utf-8
# @author : Chicho
# @version : 1.0
# @date : 2016-11-1 11:00
# @ function : Batching rename the name of file
# @running : python renameGator.py
import os
#path储藏了我们需要处理文件的路径,假设我的路径就叫这个
path = "/home/chicho/test/Out/"
# 之后我们或许文件列表使用的是listdir()这个函数,我们需要
#引入 os --->import os 才能使用
# 下面的图形为我们展示了这个函数的运行结果
fileList=os.listdir(path)
for f in fileList:
filePath = os.path.join(path,f)
# 根据紧接着的图片我们可以发现,里面含有文件夹,还有文件,我们
#需要处理的只是文件,不是文件夹
#所以我们需要isfile来判断一下
if os.path.isfile(filePath):
portion = f.split("-")[0]# 获取文件名的前半部分
#加上后缀
newName = portion + ".xml"
#新文件的路径
#如果代码和文件不在同一个目录下必须这么修改
#否则生成的文件就会在里代码运行的目录下面
newNamePath=os.path.join(path,newName)
#重命名
os.rename(filePath,newNamePath)
print "new we are handleding the {0}".format(newName)
print "all work is done!"
OK,我们 就这么搞定了我们的代码。
当然了,这种是属于轮子型的代码,我们需要在扩展一下,让它能够更加的智能。比如说路径先不要固定死,我们可以自己输入。下面我们再来个升级版本。
我们在运行的时候就直接把参数传给我们的程序,也就是我们需要处理的路径
#!/usr/bin/env python
# coding=utf-8
# @author : Chicho
# @version : 2.0
# @date : 2016-11-1 11:00
# @ function : Batching rename the name of file
# @running : python renameGator.py
# @running : python renameGator.py you_file_path
# : e.g: python renameGator.py /home/chicho/test/Out/
import os
import sys
def Usage():
print "usage:"
print "python renameGator.py your_file_path\n"
if len(sys.argv)==1:
path = "/home/chicho/test/sootAndroidOut/"
elif len(sys.argv)==2:
path = sys.argv[1]
if not os.path.exists(path):
print "\nyou input is wrong, cannot find the path!"
print "Please check you path!\n"
Usage()
sys.exit(1)
fileList=os.listdir(path)
for f in fileList:
filePath = os.path.join(path,f)
if os.path.isfile(filePath):
portion = f.split("-")[0]
newName = portion + ".xml"
newNamePath=os.path.join(path,newName)
os.rename(filePath,newNamePath)
print "new we are handleding the ****++ {0} ++****".format(newName)
print "all work is done!"
当然了这个只是一个简答 的Demo,还有不完善的地方,就比如说我们参数处理部分还是不完善。还需要再增加一个判断条件,防止用户的错误输入。
下面我们再把逼格提升一点。写的更加像程序员该做的事情。
#!/usr/bin/env python
# coding=utf-8
# @author : Chicho
# @version : 3.0
# @date : 2016-11-1 11:00
# @ function : Batching rename the name of file
# @running : python renameGator.py
# @running : python renameGator.py you_file_path
# : e.g: python renameGator2.py /home/chicho/test/sootAndroidOut/
# @running : python renameGator2.py -h
# @running : python renameGator2.py -i your_file_path
# e.g: python renameGator2.py /home/chicho/test/sootAndroidOut/
import os
import sys,getopt
def Usage():
print "usage:"
print "python renameGator.py your_file_path\n"
def usage1():
print "usage:"
print "python renameGator2.py -i your_file_path"
#********************************
opts,args = getopt.getopt(sys.argv[1:],"hi:")
for op,value in opts:
if op == "-i":
path = value
if not os.path.exists(path):
print "Cannot find the Path!"
sys.exit(1)
elif op == "-h":
usage1()
sys.exit(0)
if len(sys.argv)==1:
path = "/home/chicho/test/sootAndroidOut/"
elif len(sys.argv)==2:
path = sys.argv[1]
if not os.path.exists(path):
print "\nyou input is wrong, cannot find the path!"
print "Please check you path!\n"
Usage()
print "or"
usage1()
sys.exit(1)
fileList=os.listdir(path)
i=0
for f in fileList:
filePath = os.path.join(path,f)
if os.path.isfile(filePath):
portion = f.split("-")[0]
newName = portion + ".xml"
newNamePath=os.path.join(path,newName)
os.rename(filePath,newNamePath)
print "new we are handleding the ****++ {0} ++****".format(newName)
i = i+1
print "There are {0} files being handled!".format(i)
print "all work is done!"
用户在不知道怎么运行代码的情况下我们可以通过运行 -h来得到帮助。
但是这代码的容错能力还是一般,要是有的文件当中根本就没有“-”,那么我们就只需要修改需要改名字的文件。
比如上面这个我们不需要处理apv.xml这个文件
如果要用上面这个代码我们发现处理的结果就会有问题。
所以我们再来改进一下我们的代码
#!/usr/bin/env python
# coding=utf-8
# @author : Chicho
# @version : 4.0
# @date : 2016-11-1 11:00
# @ function : Batching rename the name of file
# @running : python renameGator.py
# @running : python renameGator.py you_file_path
# : e.g: python renameGator3.py /home/chicho/test/sootAndroidOut/
# @running : python renameGator3.py -h
# @running : python renameGator3.py -i your_file_path
# e.g: python renameGator2.py /home/chicho/test/sootAndroidOut/
import os
import sys,getopt
def Usage():
print "usage:"
print "python renameGator.py your_file_path\n"
def usage1():
print "usage:"
print "python renameGator2.py -i your_file_path"
#********************************
opts,args = getopt.getopt(sys.argv[1:],"hi:")
for op,value in opts:
if op == "-i":
path = value
if not os.path.exists(path):
print "Cannot find the Path!"
sys.exit(1)
elif op == "-h":
usage1()
sys.exit(0)
if len(sys.argv)==1:
path = "/home/chicho/test/sootAndroidOut/"
elif len(sys.argv)==2:
path = sys.argv[1]
if not os.path.exists(path):
print "\nyou input is wrong, cannot find the path!"
print "Please check you path!\n"
Usage()
print "or"
usage1()
sys.exit(1)
fileList=os.listdir(path)
i=0
for f in fileList:
filePath = os.path.join(path,f)
if os.path.isfile(filePath):
if not "-" in f:
continue
portion = f.split("-")[0]
newName = portion + ".xml"
newNamePath=os.path.join(path,newName)
os.rename(filePath,newNamePath)
print "new we are handleding the ****++ {0} ++****".format(newName)
i = i+1
print "There are {0} files being handled!".format(i)
print "all work is done!"
运行一下看看处理的结果
当然了,这个是个轮子的代码,为了能方便广大人民也能使用这个代码,我们就把这个代码改装成轮子。
我们把这个代码写入到一个叫做rename.py 的代码中,改造成轮子。
#!/usr/bin/env python
# coding=utf-8
# @author : Chicho
# @version : 1.0
# @date : 2016-11-1 11:00
# @ function : Batching rename the name of file
# @running : python rename.py
import os
def renameFile(path):
fileList=os.listdir(path)
for f in fileList:
filePath = os.path.join(path,f)
if os.path.isfile(filePath):
portion = f.split("-")[0]
newName = portion + ".xml"
newNamePath=os.path.join(path,newName)
os.rename(filePath,newNamePath)
print "new we are handleding the {0}".format(newName)
print "all work is done!"
怎么调用呢,
看下面的代码:
#!/usr/bin/env python
# coding=utf-8
# @author : Chicho
# @version : 1.0
# @date : 2016-11-1 13:45
# @function : Batching rename the name of files
# @running : python invoke.py
import rename
path="/home/chicho/test/sootAndroidOut/"
#rename.renameFile(path)
if __name__== "__main__":
rename.renameFile(path)
那么,我们就把整个功能都实现了。
好好学习,天天向上
你必须非常努力,才可以看起来毫不费力
不要忘了做过的梦
shining,shinging
每当有泪儿流
就回到那个宇宙
天上星星,仿佛听她诉说
骄傲的闪不停