Python 根据查找表值将目录附加到文件名
如何根据查找表中存储的开/关开关和文件扩展名将父目录的名称附加到文件名中 例如,如果目录以…Python 根据查找表值将目录附加到文件名,python,python-3.x,Python,Python 3.x,如何根据查找表中存储的开/关开关和文件扩展名将父目录的名称附加到文件名中 例如,如果目录以…=d5结尾,则根据查找表,目录中的所有原始文件(nef、jpg、avi)文件名将附加一级父目录名,如dirname\u origfilename.nef。如果['append\u dir\u to\u filename']=0,则不要追加目录名 文件名模式在之前和之后: CWD 01_camdirab=d5
=d5
结尾,则根据查找表,目录中的所有原始文件
(nef、jpg、avi
)文件名将附加一级父目录名,如dirname\u origfilename.nef
。如果['append\u dir\u to\u filename']=0
,则不要追加目录名
文件名模式在之前和之后:
CWD
01_camdirab=d5
/aaa/ .nef,.jpg,.avi,.wav
02_camdirxyz=g7
/bbb/ddd/ .cr2,.jpg,.mp4
03_camdire012345=a9
/yyy/kkk/xxx/ .mp4,.jpg,.avi,.thm
04_camdire012345
/ .mp4,.jpg,.avi
CWD
01_camdirab=d5
/aaa/aaa_.nef, aaa_.jpg, aaa_.avi, .wav #appended raw files
02_camdirxyz=g7
/bbb/ddd/.cr2,.jpg,.mp4 #not appended, 'append_dir_to_filename'] = 0
03_camdire012345=a9
/yyy/kkk/xxx/ xxx_.mp4, xxx_.jpg, xxx_.avi, .thm #appended raw files
04_camdire012345
/.mp4,.jpg,.avi #not appended, dir not in lookup,
代码(无法正确链接到查找表):
1台摄像机的实际查找表条目。有10个摄像头,所以是这个的10倍
config['d5']['append_dir_to_filename'] = 1
config['d5']['device_name'] = 'Nikon-D5'
config['d5']['raw_file'] = ('nef', 'jpg', 'avi')
config['d5']['sup_file'] = ('jpg', 'wav')
config['d5']['to_else_file'] = ('avi')
config['d5']['timestamp'] = ('lwt')
config['d5']['md5'] = 1
config['d5']['code1'] = 'FAR'
config['d5']['gps'] = 1
实际上,您还没有在代码中显示使用查找表的部分,但是您可以通过重新构造循环表来简化问题。大概是这样的:
config = {
'append_dir_to_filename' : ('d5', 'a9'),
'd5': ('nef', 'jpg', 'avi'),
'a9': ('mp4', 'jpg', 'avi')
}
这些修改假定您不需要不希望附加到文件名的目录的信息。有了这一点,代码的其余部分就非常简单了:
prefix = os.path.basename(root)
if (prefix[-2:] in config['append_dir_to_filename']):
for f in files:
for extension in config[prefix[-2:]]:
if (f.endswith('.' + extension)):
#Do the appending business here
还没有真正测试代码,但这应该适合您
编辑:如果您遵循我评论中的建议,请使用以下代码:
prefix = os.path.basename(root)
if (prefix[-2:] in config['append_dir_to_filename']):
for f in files:
cameraObj = config[prefix[-2:]]
for extension in cameraObj.supported_extensions:
if (f.endswith('.' + extension)):
#Do the appending business here
查找表如下所示:
config = {
'append_dir_to_filename' : ('d5', 'a9'),
'd5': Camera(...list of properties...),
'a9': Camera(...list of properties...)
}
编辑:好的,我必须从头开始编写整个代码。这个版本绝对有效
import os
cwd = os.getcwd()
config = {
'append_dir_to_filename' : ('d5', 'a9'),
'd5': ('nef', 'jpg', 'avi'),
'a9': ('mp4', 'jpg', 'avi')
}
cameraDirs = [os.path.join(cwd, x) for x in next(os.walk(cwd))[1] if x[-2:] in config['append_dir_to_filename']]
for cameraDir in cameraDirs:
cameraShortName = cameraDir[-2:]
for rootDir, _, files in os.walk(cameraDir):
prefix = os.path.basename(rootDir)
for file in files:
if (any(x for x in config[cameraShortName] if file.endswith(x))):
os.rename(os.path.join(rootDir, file), os.path.join(rootDir, "{}_{}".format(prefix, file)))
谢谢,我会测试的。我很感谢您对查找表最佳结构的评论。我的原始问题中的查找表是实际查找表的简化版(摘录),因为有10种相机类型(d5、g7…),每种都有8个参数(原始文件、附加到文件名、长相机名称、支持文件…),其中一些参数(如“原始文件”)有多个值(.nef、.tif、.jpg)[这些值的顺序与归档相关]).那么…考虑到这种复杂性,您仍然建议重新构造查找表吗?以下是我的建议。将“append_dir_to_filename”保持与我在解决方案中建议的相同。因此,在您的完整场景中,它现在将有10个值。对于每个值,在查找表中有一个映射到摄影机对象的键,而不是任何内置类型。Camera对象依次包含您提到的所有属性,如原始文件列表、相机名称、支持文件等。这显然需要更改建议的代码,因此我将进行编辑以提供提示。谢谢。有关1个相机的实际表项,请参阅orig问题末尾。我有10个。因此,不确定如何处理
'd5':摄影机(…属性列表…),
format…?将所有内容放在一行中一个摄像头?10行中10个摄像头?不需要放在一行中。只是在将对象分配给查找表中的键之前需要初始化对象。对象初始化可以在单独的行中完成,如:d5=摄像头('Nikon-d5','lwt',…)然后在查找表中使用它作为“d5”:d5。不幸的是,您必须创建10个对象,因为每个对象的数据都是唯一的。Re代码:它不重命名文件,没有错误消息。我在原始问题中插入了我从您的答案中尝试的内容。请随意编辑。我缺少什么?重新查找:谢谢您的想法,让我们考虑一下。
import os
cwd = os.getcwd()
config = {
'append_dir_to_filename' : ('d5', 'a9'),
'd5': ('nef', 'jpg', 'avi'),
'a9': ('mp4', 'jpg', 'avi')
}
cameraDirs = [os.path.join(cwd, x) for x in next(os.walk(cwd))[1] if x[-2:] in config['append_dir_to_filename']]
for cameraDir in cameraDirs:
cameraShortName = cameraDir[-2:]
for rootDir, _, files in os.walk(cameraDir):
prefix = os.path.basename(rootDir)
for file in files:
if (any(x for x in config[cameraShortName] if file.endswith(x))):
os.rename(os.path.join(rootDir, file), os.path.join(rootDir, "{}_{}".format(prefix, file)))