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

我有一个包含多个子文件夹的文件夹,每个子文件夹里面都有一个文件。我正在使用 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 时,我得到了根目录和文件名,但无法更改文件名。感谢任何帮助。


料青山看我应如是
浏览 224回答 2
2回答

12345678_0001

import osdef 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.

互换的青春

它listdir()在两个级别都使用,它检查并忽略第一级子目录中更深的嵌套目录。这是我的代码,注释很好:import osdef 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python