使用python写脚本之练习一
需求:
1) 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(如:X4G5.png)
2) 将当前img目录所有以.png结尾的后缀名改为.jpg
题目是在其他博主的文章上看见的,下面会分享python写的和shell写的版本,带注释。
- 原作者的版本
原作者的版本没有很多注释,我复制在这里,加了一些详细的注释,方便大家理解。
import os
import random
import string
def gen_code(len=4):
#随机生成4位验证码
li = random.sample(string.ascii_letters + string.digits,len) # string模块可以快速获取所有字母和数字,random.sample()可以在指定范围的元素获取指定返回的随机个数元素,并以列表的形式
#将列表元素拼接为字符串
return ''.join(li) # str.join(iterables) 将传进来的元素拼接成字符串
def create_files():
#随机生成100个验证码
li = [gen_code() for i in range(100)] # 生成一个列表,100个元素,每个元素有四个字符串,由gen_code()生成
os.mkdir('img')
for name in li:
os.mknod('img/' + name + '.png')
# create_files()
def modify_suffix(dirname,old_suffix,new_suffix):
"""
:param dirname: 要操作的目录
:param old_suffix: 之前的后缀名
:param new_suffix: 新的后缀名
:return:
"""
if os.path.exists(dirname):
#找出所有以old_suffix结尾的文件名
pngfile = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))
# os.listdir()返回一个包含所有文件名的列表,lambda定义了一个匿名函数,后缀只有满足old_suffix的文件名,才会被放入pngfile列表中
"""
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
"""
#将文件名和后缀分开
basefiles = [os.path.splitext(filename)[0] for filename in pngfile]
#文件重命名
for filename in basefiles:
oldname = os.path.join(dirname,filename+old_suffix)
newname = os.path.join(dirname,filename+new_suffix)
os.rename(oldname,newname)
print('%s重命名为%s成功' %(oldname,newname))
else:
print('%s不存在,无法操作...' %dirname)
modify_suffix('dir','.jpg','.png')
- 我的python版本
#!/usr/bin/python3
import os
from random import randint
"""
1) 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(如:X4G5.png)
2) 将当前img目录所有以.png结尾的后缀名改为.jpg
"""
path = "./img/"
# 定义一个可以生成文件名的函数
def fileName():
# 大写字母列表
uppers = list(map(lambda x: chr(x), range(ord('A'), ord('Z') + 1))) # ord() 将字符转换成ASCII码
# 小写字母列表
lowers = list(map(lambda x: chr(x), range(ord('a'), ord('z') + 1))) # chr() 将ASCII码转换成字符
# 数字
numbers = list(map(lambda x: x, range(0, 10)))
# 整合所有元素
elements = uppers + lowers + numbers
# 利用随机数生成文件名
fileName = ""
for time in range(0, 4):
num = randint(0, len(elements) - 1)
fileName += str(elements[num])
return fileName
"""
解释:
map()会根据提供的函数对指定序列做映射。
map(function, iterable) 会将序列里面的元素逐个作为参数传入function进行计算
lambda x: chr(x)
lambda表达式定义了一个简单的函数,作用是将ASCII码转为字符
"""
def makeFiles(numOfFiles):
# 创建目录
if not os.path.exists(path):
os.mkdir(path)
for i in range(0, numOfFiles):
# 获取文件名
file_name = path + fileName() + ".png"
# 处理文件名有可能出现重复的情况
try:
# 创建文件,给权限
os.mknod(file_name, 0o777) # 最终权限等于 0777 - 系统umask的值
except FileExistsError:
print("FileName has already existed,but I can handle it.")
makeFiles(1)
makeFiles(100)
# 替换文件
list_file = os.listdir(path)
for oldName in list_file:
newName = oldName.replace("png","img")
oldName = path + oldName
newName = path + newName
os.rename(oldName,newName)
- 我的shell版本
#!/usr/bin/env bash
#1) 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(如:X4G5.png)
#2) 将当前img目录所有以.png结尾的后缀名改为.jpg
# 生成组成文件名的元素
elements=({A..Z} {a..z} {0..9})
# 定义生成文件名的函数
fileName(){
for i in {1..4}; do
num=$[ $RANDOM % ${#elements[@]} ] # 产生一个0-61的随机数
file_name=${file_name}${elements[${num}]} # 拼接文件名
done
}
# 创建文件
mkdeFiles(){
file_name=""
[[ -d "./img" ]] || mkdir ./img # 创建目录,不存在则创建
fileName # 调用函数
full_file_name="./img/"${file_name}".png" # 拼接完整文件名
for i in `seq 1 $1`;do
# 判断是否存在文件,若存在,则再次调用函数,生成新的文件名,否则直接创建文件
[[ -f ${full_file_name} ]] && mkdeFiles 1 || touch ${full_file_name}
done
}
mkdeFiles 100
# 重命名文件
for oldName in $(ls ./img/);do
newName=${oldName//png/img}
mv ./img/${oldName} ./img/${newName}
done
以上就是本次练习的解决方案,思路不唯一,欢迎交流。