Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据查找表值将目录附加到文件名_Python_Python 3.x - Fatal编程技术网

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)))