为了账号安全,请及时绑定邮箱和手机立即绑定

对于目录,将子目录中的文件重命名为子目录名+旧文件名到新目录

对于目录,将子目录中的文件重命名为子目录名+旧文件名到新目录

料青山看我应如是 2022-01-11 16:12:49
我有一个包含多个子文件夹的文件夹,每个子文件夹里面都有一个文件。我正在使用 python 并希望使用关联的子文件夹名称加上旧文件名重命名文件以成为新文件名。我已经能够获得子文件夹和文件名的列表,os.walk()但是我在更改文件名时遇到了问题。def list_files(dir):    r = []    for root, dirs, files in os.walk(dir):        for name in files:            r.append(os.path.join(root, name))            os.rename(name, r)我得到错误:类型错误:重命名:dst 应该是字符串、字节或 os.PathLike,而不是列表当我返回 r 时,我得到了根目录和文件名,但无法更改文件名。感谢任何帮助。
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

import os

def list_files(dir):

    sub_folders = os.listdir(dir)

    for sub_folder in sub_folders:

        sub_folder_path = os.path.join(dir,sub_folder)

        for root, dirs, files in os.walk(sub_folder_path):

            for file in files:

                new_filename = root.replace(dir, "").replace(os.path.sep,"_").strip("_")+"_" + file

                os.rename(os.path.join(root, file), os.path.join(root, new_filename))

input_dir = ""

assert os.path.isdir(input_dir),"Enter a valid directory path which consists of sub-directories"

list_files(input_dir)

这将为多个子目录而不是嵌套目录完成这项工作。如果要更改文件名的格式,请更改new_filename = sub_folder+ "" + file.


查看完整回答
反对 回复 2022-01-11
?
互换的青春

TA贡献1797条经验 获得超6个赞

它listdir()在两个级别都使用,它检查并忽略第一级子目录中更深的嵌套目录。


这是我的代码,注释很好:


import os


def collapse_dirs(dir):


    # get a list of elements in the target directory

    elems = os.listdir(dir)


    # iterate over each element

    for elem in elems:


        # compute the path to the element

        path = os.path.join(dir, elem)


        # is it a directory?  If so, process it...

        if os.path.isdir(path):


            # get all of the elements in the subdirectory

            subelems = os.listdir(path)


            # process each entry in this subdirectory...

            for subelem in subelems:


                # compute the full path to the element

                filepath = os.path.join(path, subelem)


                # we only want to proceed if the element is a file.  If so...

                if os.path.isfile(filepath):


                    # compute the new path for the file - I chose to separate the names with an underscore,

                    # but this line can easily be changed to use whatever separator you want (or none)

                    newpath = os.path.join(path, elem + '_' + subelem)


                    # rename the file

                    os.rename(filepath, newpath)


def main():

    collapse_dirs('/tmp/filerename2')


main()

这是我在运行代码之前的目标目录:


filerename2

├── a

│   └── xxx.txt

├── b

│   ├── xxx.txt

│   └── yyyy

│       └── zzzz

├── c

│   └── xxx.txt

└── xxxx

这是之后:


filerename2

├── a

│   └── a_xxx.txt

├── b

│   ├── b_xxx.txt

│   └── yyyy

│       └── zzzz

├── c

│   └── c_xxx.txt

└── xxxx


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信