作者:平凡无琦世界 | 来源:互联网 | 2023-07-01 17:14
创建一个名为CarItemsCopy的CarItems树的副本,其中所有文件都位于文件名的一部分中,而没有年份,而是以年作为名称,而年目录则完全不存在。
代替其中的一些示例:
CarItems/Chevrolet/Chevelle/2011/parts.txt
CarItems/Chevrolet/Chevelle/1982/parts.txt
CarItems/Chevrolet/Volt/1994/parts.txt
它应该看起来像这样:
CarItemsCopy/Chevrolet/Chevelle/parts-2011.txt
CarItems/Chevrolet/Chevelle/parts-1982.txt
CarItems/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: Car
Keyword 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 os
import re
pattern = 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 code
for 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