吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1123|回复: 10
收起左侧

[求助] python怎么对指定目录下的文件批量重命名 文件夹名称+升序数字

[复制链接]
1378 发表于 2023-7-23 18:13
python怎么对指定目录下的文件批量重命名  文件夹名称+升序数字

桌面w文件夹中有a.txt、b.txt、c.jpg、d.txt,实现效果为第一次运行重命名后
w文件夹中为 w1.txt、w2.txt、w3.txt、c.jpg,之后再放入e.txt、f.txt到w文件夹中
再次运行重命名w1.txt、w2.txt、w3.txt、w4.txt、w5.txt、c.jpg
怎么实现这样的效果?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lalicorne 发表于 2023-7-23 20:21
按照楼主提出的运行效果,我的理解是这个Python程序只需要对.txt结尾的文件进行重命名并且命名格式是按照“文件夹名称+升序数字”
[Python] 纯文本查看 复制代码
import os
import shutil

def rename_txt_files(directory):
    files = os.listdir(directory)

    # 首先过滤出以.txt结尾的文件,因为按照要求楼主.jpg的文件是忽略的
    txt_files = [file for file in files if file.endswith(".txt")]

    # 获取目录名,用于新文件名的前缀
    dir_name = os.path.basename(directory)

    # 获取目录中已有的重命名.txt文件的数量
    existing_txt_files = [file for file in txt_files if file.startswith(dir_name)]
    num_existing_txt_files = len(existing_txt_files)

    for index, txt_file in enumerate(txt_files):
        if txt_file.startswith(dir_name):
            # 文件已经重命名过就跳过(按照楼主要求第二次运行的效果)
            continue

        num_existing_txt_files += 1
        new_file_name = f"{dir_name}{num_existing_txt_files}.txt"
        old_file_path = os.path.join(directory, txt_file)
        new_file_path = os.path.join(directory, new_file_name)
        shutil.move(old_file_path, new_file_path)
        print(f"Renamed: {old_file_path} -> {new_file_path}")

if __name__ == "__main__":
    directory_path = "/xxx/xxx/"  # 替换为你的目标文件夹路径
    rename_txt_files(directory_path)

运行之前把上面的directory_path改成目标文件夹路径即可。
以下是代码中使用到的标准库:

os: 用于与操作系统进行交互,处理文件和目录路径等操作。
shutil: 提供了一些高级文件操作函数,例如移动文件、复制文件等。
yyzg 发表于 2023-7-23 20:24
[Python] 纯文本查看 复制代码
from pathlib import Path


def rename_files(dir_path: str, ext_fmt: str, new_name_prefix: str, sort_by=None):
    root = Path(dir_path)
    if not root.is_dir():
        raise "directory path error!"
    files_to_rename = []
    for file in root.iterdir():
        if file.suffix == ext_fmt:
            tmp_name = file.parent / f'{file.name}._tmp'
            file.rename(tmp_name)
            files_to_rename.append(tmp_name)
    # 如果对文件排序有要求  可以在这里做
    # 如按照最后修改时间从晚到早排序
    # 文件相关属性 可以参考 https://docs.python.org/zh-cn/3/library/os.html#os.stat_result
    if sort_by == 'modify_time_dsc':
        files_to_rename.sort(key=lambda x: x.stat().st_mtime_ns, reverse=True)
    elif sort_by == 'modify_time_asc':
        files_to_rename.sort(key=lambda x: x.stat().st_mtime_ns)
    # 按照文件大小排序
    elif sort_by == 'size_asc':
        files_to_rename.sort(key=lambda x: x.stat().st_size)
    elif sort_by == 'size_dsc':
        files_to_rename.sort(key=lambda x: x.stat().st_size, reverse=True)

    for i, file in enumerate(files_to_rename):
        file.rename(file.parent / f'{new_name_prefix}{i + 1}{ext_fmt}')
    pass


if __name__ == '__main__':
    dir_path = './log'
    # 按修改时间  从晚到早
    rename_files(dir_path, ext_fmt='.log', new_name_prefix='mylog', sort_by='modify_time_dsc')
    # 按修改时间  从早到晚
    rename_files(dir_path, ext_fmt='.log', new_name_prefix='mylog', sort_by='modify_time_asc')
    # 按文件大小  从大到小
    rename_files(dir_path, ext_fmt='.log', new_name_prefix='mylog', sort_by='size_dsc')
    # 按文件大小  从小到大
    rename_files(dir_path, ext_fmt='.log', new_name_prefix='mylog', sort_by='size_asc')
    
    # 有更具体的排序要求  可以自己实现
 楼主| 1378 发表于 2023-7-23 20:35
本帖最后由 1378 于 2023-7-23 20:57 编辑
lalicorne 发表于 2023-7-23 20:21
按照楼主提出的运行效果,我的理解是这个Python程序只需要对.txt结尾的文件进行重命名并且命名格式是按照“ ...

嗯,谢谢。    想更进一步
w文件夹下有多个文件夹A B C D等上百个 ,abcd里面才是那些txt jpg文件
怎么才能对每个文件夹实现这样的操作呢,
还有个情况就是如果第一次运行后删掉了w2.txt,就要把这个2的位置补上,让每个文件夹里的txt文件名1到N连续
lalicorne 发表于 2023-7-23 21:50
1378 发表于 2023-7-23 20:35
嗯,谢谢。    想更进一步
w文件夹下有多个文件夹A B C D等上百个 ,abcd里面才是那些txt jpg ...

如果文件夹下有多个子文件夹的情况,使用嵌套循环来遍历每个子文件夹并进行重命名操作就可以了。想要文件名1到N连续,可以在重命名时检查已有的文件名并更新编号,按第一次给的代码稍改一下就可以:
[Python] 纯文本查看 复制代码
import os
import shutil

def rename_files_in_subdirectories(directory):
    subdirectories = [subdir for subdir in os.listdir(directory) if os.path.isdir(os.path.join(directory, subdir))]

    for subdir in subdirectories:
        subdir_path = os.path.join(directory, subdir)
        files = os.listdir(subdir_path)

        # 首先过滤出以.txt结尾的文件,因为按照要求楼主.jpg的文件是忽略的
        txt_files = [file for file in files if file.endswith(".txt")]

        # 获取子文件夹名,用于新文件名的前缀
        subdir_name = os.path.basename(subdir_path)

        # 获取子文件夹中已有的重命名.txt文件数量
        existing_txt_files = [file for file in txt_files if file.startswith(subdir_name)]
        num_existing_txt_files = len(existing_txt_files)

        for index, txt_file in enumerate(txt_files):
            if txt_file.startswith(subdir_name):
                # 如果文件已经重命名过就跳过
                continue

            num_existing_txt_files += 1
            new_file_name = f"{subdir_name}{num_existing_txt_files}.txt"
            old_file_path = os.path.join(subdir_path, txt_file)
            new_file_path = os.path.join(subdir_path, new_file_name)
            shutil.move(old_file_path, new_file_path)
            print(f"Renamed: {old_file_path} -> {new_file_path}")

if __name__ == "__main__":
    directory_path = "/xxx/xxx/"  # 替换为你的目标文件夹路径
    rename_files_in_subdirectories(directory_path)
boris007 发表于 2023-7-24 09:48
代码量也不大,感觉这个问题可以直接扔给GPT了。以下为我搜索到的GPT答案:
你可以使用Python的`os`模块和`shutil`模块来实现对指定目录下文件的批量重命名。以下是一种可能的解决方案:

```python
import os
import shutil

def batch_rename(directory):
    file_list = os.listdir(directory)  # 获取目录下所有文件和文件夹的名称
    file_list.sort()  # 按照文件名排序

    count = 1
    for filename in file_list:
        if os.path.isfile(os.path.join(directory, filename)):  # 只处理文件,忽略文件夹
            new_name = 'w' + str(count) + os.path.splitext(filename)[1]  # 构造新的文件名
            shutil.move(os.path.join(directory, filename), os.path.join(directory, new_name))  # 重命名文件
            count += 1

# 使用示例
directory = '/path/to/your/directory'  # 替换为你指定的目录路径
batch_rename(directory)
```

这段代码会将指定目录下的文件按照升序进行重命名,命名规则为"w"加上一个递增的数字,保留原本的文件扩展名。

请注意,这段代码只会处理目录下的文件,而不会处理文件夹。如有需要,可以根据实际情况进行扩展。另外,在运行之前,请确保你具备足够的权限来重命名文件。
yellowchristmas 发表于 2023-7-24 10:30
lalicorne 发表于 2023-7-23 20:21
按照楼主提出的运行效果,我的理解是这个Python程序只需要对.txt结尾的文件进行重命名并且命名格式是按照“ ...

学习了,感谢啊,正愁着呢。
 楼主| 1378 发表于 2023-7-24 15:48
lalicorne 发表于 2023-7-23 21:50
如果文件夹下有多个子文件夹的情况,使用嵌套循环来遍历每个子文件夹并进行重命名操作就可以了。想要文件 ...

嗯,不知道怎么实现连续的重命名。我想的办法是先让代码读取系统日期时间给所有文件重命名一遍,然后再按文件夹名称+升序重命名,这样好像可以实现。然后你上面那段判断  文件已重命名过就跳过  的代码可以不要了。你看可行吗,或者有没有更简单的方法
lalicorne 发表于 2023-7-24 19:55
1378 发表于 2023-7-24 15:48
嗯,不知道怎么实现连续的重命名。我想的办法是先让代码读取系统日期时间给所有文件重命名一遍,然后再按 ...

如果你先提前对所有文件都重命名一遍相当于做了一次初始化,确实不需要我的那一段判断了,可行我觉得是可行的,值得一试。
这个方法很好理解和实现,你要想要再稍微再自动化一点可以按照我上面那个脚本的嵌套循环在下面写一个一键初始化文件名字的函数,然后程序先调用初始化函数然后再调用重命名函数就可以一键完成你的需求。
 楼主| 1378 发表于 2023-7-24 21:59
本帖最后由 1378 于 2023-7-25 08:51 编辑

lalicorne 发表于 2023-7-24 19:55
如果你先提前对所有文件都重命名一遍相当于做了一次初始化,确实不需要我的那一段判断了,可行我觉得是可 ...

[Python] 纯文本查看 复制代码
import os
import shutil,time

def rename_files_in_subdirectories(directory,m):
    subdirectories = [subdir for subdir in os.listdir(directory) if os.path.isdir(os.path.join(directory, subdir))]

    for subdir in subdirectories:
        subdir_path = os.path.join(directory, subdir)
        files = os.listdir(subdir_path)

        # 首先过滤出以.jpg结尾的文件,因为按照要求.txt的文件是忽略的
        jpg_files = [file for file in files if file.endswith(".jpg")]
        subdir_name = os.path.basename(subdir_path)                 #目录名称
        n,t,p=0,0,0
        if m:
            for b1 in jpg_files:
                n+=1
                new_mingzi=f"{time.strftime('%Y-%m-%d-%H-%M-%S')}-{n}.jpg"
                old_lj=os.path.join(subdir_path, b1)
                new_lj=os.path.join(subdir_path,new_mingzi)
                shutil.move(old_lj,new_lj)
        else:
            for b1 in jpg_files:
                p+=1
                new_mingzi=f"{ml}-{subdir_name}-{p}.jpg"
                old_lj=os.path.join(subdir_path, b1)
                new_lj=os.path.join(subdir_path,new_mingzi)
                shutil.move(old_lj,new_lj)
    if m:
        rename_files_in_subdirectories(directory_path,m=0)

if __name__ == "__main__":
    ml='CELINE-WB'
    mulu = r'C:\Users\yws\Desktop' 
    o=1
    directory_path = os.path.join(mulu,ml)  
    rename_files_in_subdirectories(directory_path,o)

改成了这个样子
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-10 22:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表