如何将文件重命名为子目录
Posted
技术标签:
【中文标题】如何将文件重命名为子目录【英文标题】:how to rename files to sub directory 【发布时间】:2017-03-25 10:35:41 【问题描述】:我正在尝试使用它们所在的子目录标签重命名子目录中的所有 .wav 文件。 Fox 示例
directory/sub-directory1/ 1_1.wav 到 directory/sub-directory1/ sdir1_1.wav 。我知道如何在 python 中重命名文件,但我无法遍历子目录然后添加标签。
虽然下面的代码可以对齐子目录和文件,但它不会循环遍历所有文件,因为如果文件多于目录,for dire in dirs:
将不起作用
import os
rootdir = r'C:\Users\test'
for subdir, dirs, files in os.walk(rootdir):
for dire in dirs:
for file in files:
filepath = subdir+os.sep+file
if filepath.endswith('.wav'):
print (dire+ file)
【问题讨论】:
os.walk
不能那样工作。文件和目录上的循环不能嵌套。您能否更具体地说明您想要实现的目标?
我有一个文件夹,里面有十几个子文件夹。在所有子文件夹中都有一些 .wav(文件)。这些 .wav 文件是随机命名的,并不系统。所以,我想做的是用子目录的名称重命名这些文件并增加例如:subdir1.wav、subdir2.wav 等等。基本上试图将子目录的引用添加到wave文件中。我希望我清楚吗?
为此我需要遍历子目录并重命名文件,然后转到另一个子目录并重命名这些文件等等。
您的意思是 sub-directory2/ 1.wav 到 sub-directory2/ sdir2_1.wav 吗?请重新阅读您的问题并对其进行编辑以更清晰。
@choman 我知道这是一个例子,但是当人们试图提供帮助时它会混淆。首先,您说要重命名文件名,然后在您的示例中,您还要重命名目录。你明白我的意思吗?
【参考方案1】:
我已经测试过了,它可以工作。
import shutil
import os
from glob import glob
# Define your source folder.
source_dir = 'F:\\Test\\in\\'
# Define your target folder.
target_dir = 'F:\\Test\\out\\'
# Define the file extension you want to search for.
file_ext = '*.mp4'
# use glob to create a list of files in your source DIR with teh desired extension.
file_check = glob(source_dir + file_ext)
# For each item in file_check shuttle will copy teh source file and write it renamed to your target location.
for i in file_check:
shutil.copy(i, target_dir + 'dir_out_' + os.path.basename(i))
#os.path.basename gives us just the filename and extension minus the absolute path.
#i,e test123456.mp4
这里是目标目录的内容:
F:\Test\out\dir_out_test_10.mp4
F:\Test\out\dir_out_test_2.mp4
F:\Test\out\dir_out_test_3.mp4
F:\Test\out\dir_out_test_4.mp4
F:\Test\out\dir_out_test_5.mp4
F:\Test\out\dir_out_test_6.mp4
F:\Test\out\dir_out_test_7.mp4
F:\Test\out\dir_out_test_8.mp4
F:\Test\out\dir_out_test_9.mp4
如果您想进行文件系统移动而不是复制,请查看shutil 和glob,请使用shutil.move()
而不是shutil.copy()
。
编辑:
Python 3.5+
这是在根目录中查找所有文件的方法:
glob('F:\\test\\**\\*.mp4', recursive=True)
这将找到根目录和子文件夹中的所有文件,然后您可以使用上面的shutil方法对它们进行您想要的操作。
【讨论】:
感谢您的帮助。在您的代码中,source_dir = 'F:\\Test\\in\\'
仅指向一个文件夹,因此所有 .wav 文件都必须在此文件夹中,但在我的情况下,'F:\\Test\\in\\'
下有许多子文件夹,例如 'F:\\Test\\in\\sub_folder1'
、'F:\\Test\\in\\sub_folder2'
等。因此,我需要在文件夹内循环查找子文件夹。我不确定您的回答是否符合我的要求,或者我可能没有理解。请解释是否可以通过 glob 实现?即遍历子文件夹?【参考方案2】:
经过一些试验和错误,我能够达到结果。
import os
rootdir = r'C:\Users\test'
for dirpath, dirnames, filenames in os.walk(rootdir):
for file in filenames:
filepath = dirpath +os.sep+file
if filepath.endswith('wav'):
# split directory filepath
split_dirpath = dirpath.split(os.sep)
# take the name of the last directory which I want to tag
dir_tag = (split_dirpath[-1])
# wasn't necessary to split the extension, still....
f_name, f_ext = (os.path.splitext(file))
# add the tag of the sub dir
f_name= dir_tag +'_'+ f_name
# create the new file name
new_name = f_name +f_ext
print(new_name)
os.rename(filepath,dirpath+os.sep+new_name)
【讨论】:
以上是关于如何将文件重命名为子目录的主要内容,如果未能解决你的问题,请参考以下文章