创建一个名为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