当前位置 : 主页 > 网络编程 > 其它编程 >

将文件重命名为子目录中的年份而不是子目录

来源:互联网 收集:自由互联 发布时间:2023-07-02
创建一个名为CarItemsCopy的CarItems树的副本,其中所有文件都位于文件名的一部分中 创建一个名为CarItemsCopy的CarItems树的副本,其中所有文件都位于文件名的一部分中,而没有年份,而是以
创建一个名为CarItemsCopy的CarItems树的副本,其中所有文件都位于文件名的一部分中

创建一个名为CarItemsCopy的CarItems树的副本,其中所有文件都位于文件名的一部分中,而没有年份,而是以年作为名称,而年目录则完全不存在。代替其中的一些示例:

CarItems/Chevrolet/Chevelle/2011/parts.txtCarItems/Chevrolet/Chevelle/1982/parts.txtCarItems/Chevrolet/Volt/1994/parts.txt

它应该看起来像这样:

CarItemsCopy/Chevrolet/Chevelle/parts-2011.txtCarItems/Chevrolet/Chevelle/parts-1982.txtCarItems/Chevrolet/Volt/parts-1994.txt

使用Python执行此操作(您不能通过手动重新排列来创建副本)。您可以使用os模块的walk生成器。提示:您可能会发现os.path模块的split函数会有所帮助。不过,您不必使用它。

这是我到目前为止获得的代码:

def create_dir(dir_path):""" Creates a new directory.This function is used to create a new directory.Positional Input Parameter: directory: CarKeyword Input Parameters: None """ if not os.path.exists(dir_path): former_path,sub_dir = os.path.split(dir_path) if os.path.exists(former_path) or former_path == "": os.mkdir(dir_path) else: create_dir(former_path) os.mkdir(dir_path) for dirpath,dirname,filename in os.walk("CarItems"): if len(filename) > 0: sub_path,year = os.path.split(dirpath) for i in filename: name,suffix = os.path.splitext(i) new_file = name + "-" + year + suffix new_path = sub_path.replace("CarItems","CarItemsCopy") create_dir(new_path) file_path = os.path.join(dirpath,i) new_file_path = os.path.join(new_path,new_file) shutil.copy2(file_path,new_file_path)

FileNotFoundError:[错误2]没有这样的文件或目录:”这是我在Mac上遇到的错误,在Windows上可以正常使用。我的问题是,为什么?要在Mac上运行,需要进行哪些调整?谢谢!


尽管可以直接找出新的文件名,但您确实需要步行才能到达所有文件名。

伪代码:

# Make a list of filenames with os.walk# For each filename in that list:# If the filename matches a regex of ending with four digits,slash,name# make the new filename# use os.rename to move the original file to the new file.

您需要制作一个单独的列表,而不仅仅是for name in os.walk...,因为我们将不断更改内容。

使用Regex101创建一个正则表达式,我们得到了一个解决方案。您可能需要先尝试一下,然后再进行以下操作:

import osimport repattern = r'(.*)(\\|/)(\d\d\d\d)(\\|/)(\w+)(\.txt)' # Note r'..' means raw,or take backslashes literally so the regex is correct.filenames = [ os.path.join(dir_,name) for (dir_,_,names) in os.walk('.') for name in names ] # Note 'dir_' because dir is reserved word # Note '_' as pythonic way of saying 'an ignored value' # Note for loops are in same order in list comprehension as they would be in codefor filename in filenames: m = re.match(pattern,filename) if m: front,sep1,year,sep2,name,ext = m.groups() new_filename = f'{front}{sep1}{name}-{year}{ext}' # print(f'rename {filename} to {new_filename}') os.rename(filename,new_filename)

保持黑客入侵!记笔记。

,

在应为部分中,我认为您犯了一个错误。 CarItemsCopy下将只存在一个目录,另一个将被重命名。

任务:

创建名为CarItems的{​​{1}}树的副本,其中所有文件都位于文件名的一部分中,而不是以年命名的目录中,而是以年为名,而年份目录完全不存在

CarItemsCopy,path和shutil模块应该简化任务:

os

上一篇:【android自定义控件】自定义高级动画
下一篇:没有了
网友评论