随笔记录几个python上用到的小程序,非常简短,可以直接改路径运行
- 生成文件夹:
例如,我需要在路径 E:/d15/frame/try1/ 下,生成名字为cluster1到cluster9的若干文件夹,其中可能有些文件夹已经被生成过了
程序:
import os
for i in range(1,10):
path ='E:/d15/frame/try1/'
if not os.path.exists(path+'cluster'+str(i)):
os.makedirs(path+'cluster'+str(i))
- 文件重命名:
例如,我需要把这个 'E:/d15/frame/class_0/1.10‘ 路径下的所有文件,命名为“1.10_文件序号“的格式
import os
folder_name = 'E:/d15/frame/class_0/1.10' #要命名的文件夹的路径
file_names = os.listdir(folder_name) #获取文件的名称
os.chdir(folder_name)
i = 1
for name in file_names:
os.rename(name,'1.10_'+str(i)+'.jpg') #进行重命名
i += 1
- 文件名批量变动
最近在课题上有一个小需求,内容类似于把原来图片名称为:
1.1_1.jpg , 1.1_2.jpg , …1.2_1.jpg , 1.2_2.jpg , …1.10_1.jpg ,1.10_2.jpg ,…2.1_1.jpg…10.1_1.jpg , 10.1_2.jpg ,
…10.10_1.jpg…
将其中“_”后的1 2 3 4 5 改成另一个等差数列9 ,21,33…,即:
1.1_9.jpg , 1.1_21.jpg , …1.2_9.jpg , 1.2_21.jpg , …1.10_9.jpg ,1.10_21.jpg ,…2.1_9.jpg…10.1_9.jpg , 10.1_21.jpg ,
…10.10_9.jpg…
问题重点:
1.只改动中间的这个数字,其余部分还是要保留
2.“_”后数字的范围每个组都是不一样的,例如有的是1到5有的1到7
先放程序:
import os
#1获取重命名的文件夹
folder_name1 = 'E:/.....' #要命名的文件夹的路径
file_names = os.li)stdir(folder_name1)
os.chdir(folder_name1)
for name in file_names:
m=name[0]
print(m)
m=int(m)
if m in range(1,10):
if len(name)==14:
c=9
a=name[c]
a=int(a)
if a==1:
name1=name[:c]+'9'+name[c+1:]
print(name1)
os.rename(name,name1)
if a==2:
name1=name[:c]+'21'+name[c+1:]
print(name1)
os.rename(name,name1)
if a==3:
name1=name[:c]+'33'+name[c+1:]
print(name1)
os.rename(name,name1)
#等等替换,下面不再放了
- 代码释义:
本人还是小白哈所以在编程上用的方法好像不太智慧…只简要解释一下这种方法我自己走过的弯路:
1.切片问题:
文件名的格式为string,可以用切片的方式选择到所要更改的那个位置的数字,但是在我的需求中,前面序号中带有“10”的会导致切片位置不一样,需要分开考虑,因此加了对整个文件名长度的判断
2.新的数字的生成问题:
一开始非常天真的直接把切片后的内容用代码更改,例如:
a=name[c]
b=9+(a-1)*12
但是这样是不对的!因为切片后的数据类型有问题,无法进行数学运算操作
所以加了:
a=name[c]
a=int(a)
(个人的程序里数据更改没有用数列写,用公式体现等差数列肯定是更方便的,因为替换的顶多也就到10,太晚了就直接复制粘贴运行了…)
3.文件名的重新拼接问题:
这里也要注意放入的新的数字的数字类型,对于文件名维持原状的部分,仍然用切片的方式获取并拼接,即:
name1=name[:c]+'9'+name[c+1:]
这里也是要注意,如果用公式来体现等比数列并放入其中的话,要有类型的转换
,不能直接将int放进命名中
4.最后的验证
import os
folder_name1 = 'E:/....../' #填文件夹路径
file_names = os.listdir(folder_name1)
os.chdir(folder_name1)
for name in file_names:
name=name.strip('.jpg')
m=name[-1]
m=int(m)
#print(m)
if m == 2:
print("----------------------------------------error")
这里用了个小投机取巧的办法,我的文件夹中,需要更改的内容不超过10,而1-10对应后的数列中,个位数没有是2的,所以这里我用“查找个位数是否为2,有则输出error”的方法进行的检查
在一开始,本来是直接想
m=name[-5]
来取到更改的个位数(-1到-4对应“.jpg”,-5即对应要验证的个位数),但这样会有报错: String index out of range(这里我也不懂为什么超出范围了…)
因此换了个方法试了一下,即先将“.jpg"去掉:
name=name.strip('.jpg')
然后切片就变成了:
m=name[-1]
运行后没有超出范围的报错,可以进行查验