热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

创建一个名为CarItemsCopy的CarItems树的副本,其中所有文件都位于文件名的一部分中

创建一个名为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}}树的副本,其中所有文件都位于文件名的一部分中,而不是以年命名的目录中,而是以年为名,而年份目录完全不存在

CarItemsCopypathshutil模块应该简化任务:

os

推荐阅读
author-avatar
平凡无琦世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有