我想最近这两年,你一定听说过 Python 的大名,至少广告是见的不少了。Python 之所以名气大,我觉得最主要是因为干的事情多。以我为例,在原来做动画的时候,公司内部用的流程管理软件是 Python 写的,Maya 内置的程序语言 Python 就是其中之一。此外,在其余 CG 软件中,也都有 Python 的身影,比如 Houdini、3Ds Max、Blender等等。最近我也碰上一事,尝试多次之后,最终通过 Python 解决了。事情是这样的,我这有一套视频教程,但是命名不规范,没有办法按序播放。目录结构如下:

1.*.mp4
2.*.mp4
...
9.*.mp4
10.*.mp4
11.*.mp4
...
99.*.mp4
100.*.mp4

我想聪明的你,已经发现问题所在了。在视频软件播放的过程中,在播放完 1.*.mp4 之后,不会播放 2.*.mp4 而是播放 10.*.mp4 。要解决这个问题需要将所有视频的前缀数字都改成 3 位数。文件少的时候可能有个两三分钟也就改好了,但是要是超过 100 个呢?还是要费上一番功夫的。百思不得其解的时候,想起 Python 了。最终通过编写代码,3 秒钟就完成了。下面是全部的代码。

import random
import string
from pathlib import Path
from typing import Generator


def random_strings(length: int = 8) -> str:
    """生成随机字符串

    Parameters
    ----------
    length : int, optional
        字符串的长度, 默认长度为8个字节长

    Returns
    -------
    string
        返回随机字符串
    """
    strings = string.ascii_letters + string.digits
    # 使用字母加数字组成可使用的所有字符
    return "".join(random.choice(strings) for _ in range(length))


def create_file(filename: str) -> None:
    """创建文件

    Parameters
    ----------
    filename : string
        指定文件名
    """
    with open(file=filename, mode="w", encoding="utf-8") as f:
        # 将文件按名写入到文件中
        f.write(filename)
        f.close()

以上两个函数可以不写,我写这两个函数主要是怕在修改文件的时候出现莫名其妙的问题,所以就先用这两个函数用于生成一些测试用的文件。如果你也想要测试一下,可以用下面这段代码先生成一堆测试文件。

for i in range(1,122):
    # 先生成一个随机的文件名
    file = f"{i}.{random_string()}.txt"
    # 创建这个文件
    create_files(file)

接下来才是重点,下面的代码将利用 Path 类,获取指定路径下的所有文件,然后通过修改数字前缀,最终修改文件名。

def get_all_file_with_specify_extension(
    extension: str = "*.txt", dir: str = "."
) -> Generator:
    """获取所有指定拓展名的文件

    Parameters
    ----------
    extension : str, optional
        拓展名, by default "*.txt"
    dir : str, optional
        指定文件所在的目录,默认为当前文件夹 by default "."

    Returns
    -------
    Generator
        返回目录下的所有文件
    """
    path = Path(dir)
    return path.glob(extension)


def rename_with_digits(file: str, length: int = 3, delimiter: str = ".") -> str:
    """修改前缀数字的长度

    Parameters
    ----------
    file : str
        文件名称
    length : int, optional
        前缀数字的长度, by default 3
    delimiter : str, optional
        数字与文字之间的连接符, by default "."

    Returns
    -------
    str
        处理好的新文件名
    """

    numb, *extension = file.split(delimiter)
    numb = str(numb).rjust(length, "0")
    return f"{numb}.{'.'.join(extension)}"


# 修改当前文件夹下面的文本文件
for file in get_all_file_with_specify_extension():
    # 注意这里 file 是一个路径类,如果要修改文件名,应该使用 file.name
    if file.is_file():
        new_file = file.with_name(rename_with_digits(file.name))
        file.replace(new_file)


# 修改指定目录下所有文件的文件名,不区分文件类型
# extension 这个变量用于指定拓展名,如果希望修改 MP4 文件,则设置为 MP4,这里修改所有文件
# dir 这个变量用于指定目录
for file in get_all_file_with_specify_extension(extension="*", dir="../JavaScript"):
    # 由于文件夹下可能存在目录,所以这里添加一个判断语句,只有在时文件的时候才修改。
    if file.is_file():
        new_file = file.with_name(rename_with_digits(file.name))
        file.replace(new_file)

到这里需要说明以下,我的 Python 版本是 3.9.6 ,上述代码在 3.7 版本以上应该就可以运行。欢迎大家测试,点赞,转发。下篇文章分享通过 Python 下载百度文档。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。