Python+Shell: 使用python写脚本之练习一

使用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

以上就是本次练习的解决方案,思路不唯一,欢迎交流。

猜你喜欢

转载自blog.csdn.net/rookie23rook/article/details/115124740