【问题标题】:How to rename subfolders by copying the name of the file in the subfolder?如何通过复制子文件夹中的文件名来重命名子文件夹?
【发布时间】:2019-08-28 00:08:13
【问题描述】:

我正在尝试根据文件夹中的文件名重命名子文件夹。我希望文件夹名称和文件名相同。目前我有一个脚本循环遍历所有子文件夹并将文件重命名为正确的名称。现在我需要使用那个“正确的名称”并用相同的名称重命名该文件所在的子文件夹。

目录的当前设置:

Folder A(Parent folder)

    Folder sample1(Sub folder)
       1. sample.pdf
       2. correct_name1.xml

    Folder B2(Sub folder)
       1. sample.pdf
       2. correct_name2.xml

    Folder B3(Sub folder)
       1. sample.pdf
       2. correct_name3.xml

预期输出:

 correct_name1 B1(Sub folder)
       1. correct_name1.pdf
       2. correct_name1.xml

    correct_name2 B2(Sub folder)
       1. correct_name2.pdf
       2. correct_name2.xml

    correct_name3 B3(Sub folder)
       1. correct_name3.pdf
       2. correct_name3.xml

另外,如果有人可以帮助重命名 pdf 文件,那将不胜感激。 pdf 文件的名称与 xml 完全相同。

我尝试在 if 语句中添加它,但它没有重命名子文件夹。

for dir in dirs:
     sub_folder = os.path.join(path,curr_fld,dir)
     print(sub_folder)
     os.rename(sub_folder,new_name2)

我的代码:

def rename(path)
for root, dirs, files in os.walk(path):
        for file in files:
            curr_fld = os.path.basename(root)
            old_name = os.path.join(path,curr_fld,file)

            if file.endswith(".xml"): 
                file_name, file_ext = os.path.splitext(file)
                print(file_name)

                new_name = "{}-{}-{}-{}{}".format(cfr, year, title, item_id, file_ext) # this is what i had done originally to get the correct file name
                new_name2 = os.path.join(path,curr_fld,new_name) #my correct name

                try:
                    os.rename(old_name,new_name2) 
                except WindowsError:
                     print("Didn't work!")

【问题讨论】:

  • 请同时显示最终预期的文件结构。据我了解,这是不可能的,因为在同一个地方不能有多个同名文件夹
  • 我添加了预期的输出。每个文件夹都有不同的名称,因为文件夹中的每个文件都有不同的名称。我希望这是有道理的

标签: python subdirectory file-rename


【解决方案1】:

如果files 列表包含.xml 文件,您应该使用root 作为重命名目录:

def rename(path):
    for root, _, files in os.walk(path):
        try:
            new_name, _ = next(os.path.splitext(file) for file in files if file.endswith('.xml'))
        except StopIteration:
            continue
        os.rename(root, os.path.join(os.path.dirname(root), new_name))

【讨论】:

  • 谢谢!这很有效,我真的很感激。我认为使它成为另一个函数比我编写的那个长函数更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2016-07-24
  • 2016-09-11
  • 2011-12-30
  • 2016-02-05
  • 2018-08-21
相关资源
最近更新 更多