Python 为文件夹中的文件生成口述元素列表

Python 为文件夹中的文件生成口述元素列表,python,list,python-3.x,dictionary,Python,List,Python 3.x,Dictionary,我正在制作一个脚本,列出目录中的现有文件,然后将它们保存到字典列表中。在目录中有两种类型的图像,foo和bar,它们在名称的末尾有一个标识符,用于知道应该查看它们的位置,例如: foo_1.jpg foo_2.jpg foo_5.jpg bar_1.jpg bar_2.jpg bar_3.jpg 我想得到下一个结果: files = [ {'position': 1, 'foo': '/img/foo_1.jpg','bar': '/img/bar_1.jpg'}, {'p

我正在制作一个脚本,列出目录中的现有文件,然后将它们保存到字典列表中。在目录中有两种类型的图像,foo和bar,它们在名称的末尾有一个标识符,用于知道应该查看它们的位置,例如:

foo_1.jpg
foo_2.jpg
foo_5.jpg
bar_1.jpg
bar_2.jpg
bar_3.jpg
我想得到下一个结果:

files = [ {'position': 1, 'foo': '/img/foo_1.jpg','bar': '/img/bar_1.jpg'},
          {'position': 2, 'foo': '/img/foo_2.jpg','bar': '/img/bar_2.jpg'},
          {'position': 3, 'foo': '','bar': '/img/bar_3.jpg',
          {'position': 5, 'foo': '/img/foo_5.jpg','bar': ''} ]
这是我的密码:

def files_in_folder(folder_name):
    folder_path = os.path.join(current_app.config['UPLOAD_FOLDER'],   'files', str(folder_name))
    data = []
    if not os.path.isdir(folder_path):
        return [{}, {}, {}, {}, {}, {}, {}, {}, {}]
    else:
        for filename in os.listdir(folder_path):
            position = int(re.search('[0-9]+', filename).group())
            if "foo" in filename:
                foo_register = {'position': position,
                                'foo': folder_path + '/' + filename, 
                                'bar': ''}
            else:
                bar_register = {'position': position,
                                'foo': '', 
                                'bar': folder_path + '/' + filename }
            register = {**foo_register, **bar_register}
            data.insert(position-1, register)
            print(data) 
我的结果是:

[{'foo': '', 'bar': 'uploads/campaigns/1/bar_1.png', 'position': 1},
 {'foo': '', 'bar': 'uploads/campaigns/1/bar_2.png', 'position': 2},
 {'foo': '', 'bar': 'uploads/campaigns/1/bar_3.png', 'position': 3},
 {'foo': 'uploads/campaigns/1/foo_1.png', 'bar': '', 'position': 1,
 {'foo': '', 'bar': 'uploads/campaigns/1/bar_3.png', 'position': 3}]
我的代码中缺少了什么?。有一个最好的蟒蛇式的方法吗

提前谢谢

尝试使用filename.startswith'bar'或filename.startswith'foo'来区分foo_1.jpg和bar_1.jpg

尝试使用position=intos.path.splitextfilename[0]。拆分“”[1]而不是re

不使用寄存器={**foo\u寄存器,**bar\u寄存器}: e、 g

输出:

{'foo': 'uploads/campaigns/1/foo_.png', 'bar': '', 'position': 1}
{'foo': 'uploads/campaigns/1/foo_.png', 'bar': 'uploads/campaigns/1/bar_1.png', 'position': 1}
我想这就是你得到意外结果的原因

您可以尝试以下方法:

a.update({k:v for k,v in b.items() if v})

print(a)
输出:

{'foo': 'uploads/campaigns/1/foo_.png', 'bar': '', 'position': 1}
{'foo': 'uploads/campaigns/1/foo_.png', 'bar': 'uploads/campaigns/1/bar_1.png', 'position': 1}
尝试使用filename.startswith'bar'或filename.startswith'foo'来区分foo_1.jpg和bar_1.jpg

尝试使用position=intos.path.splitextfilename[0]。拆分“”[1]而不是re

不使用寄存器={**foo\u寄存器,**bar\u寄存器}: e、 g

输出:

{'foo': 'uploads/campaigns/1/foo_.png', 'bar': '', 'position': 1}
{'foo': 'uploads/campaigns/1/foo_.png', 'bar': 'uploads/campaigns/1/bar_1.png', 'position': 1}
我想这就是你得到意外结果的原因

您可以尝试以下方法:

a.update({k:v for k,v in b.items() if v})

print(a)
输出:

{'foo': 'uploads/campaigns/1/foo_.png', 'bar': '', 'position': 1}
{'foo': 'uploads/campaigns/1/foo_.png', 'bar': 'uploads/campaigns/1/bar_1.png', 'position': 1}

很明显,我的硬盘上没有这些文件,所以这里有一些代码可以处理文件名列表,但根据您的目的调整它应该不难

这段代码的核心是一个帮助函数parse_name,它从文件名中提取位置和图像类型信息种类

为了按照你想要的方式组织这些信息,我把它们放进了一个目录。然后,我们对外部dict的键进行排序,以创建所需的dict列表。我们使用数字排序,这样11就不会在2之前排序,以此类推

输出

实际上,我们不需要那个sort key函数,因为pos已经在parse_name中转换为int。哎呀所以我们可以这样做:

files_list = [files_dict[k] for k in sorted(files_dict.keys())]
for循环可压缩为:

for s in data:
    kind, pos = parse_name(s)
    files_dict.setdefault(pos, {'position': pos})[kind] = s
虽然这比以前的版本更神秘

files_dict.setdefault(pos, {'position': pos})
使用密钥pos获取文件中的sub dict。如果它不存在,则使用“position”的初始键值对pos创建它


然后,我们用类型s更新子目录,其中s是当前文件的完整文件名。

显然,我的硬盘上并没有这些文件,所以这里有一些处理文件名列表的代码,但根据您的目的调整它应该不难

import os, re
cwd = os.getcwd()
print cwd


def update(li, pos, path, key):
    added = False
    if len(li) == 0:
        di=dict()
        di["position"] = int(pos)
        di[key] = path
        li.append(di)
        added = True        
    else:
        for di in li:
            if di["position"]==pos:                
                di[key] = path
                added = True


if not added:
    di=dict()
    di["position"] = int(pos)
    di[key] = path
    li.append(di)    



li = []
for filename in os.listdir(cwd+r'/try'):        # folder name where my files are.
    position = int(re.search('[0-9]+', filename).group())
    print filename, position
    path = cwd + '/' + filename
    if "foo" in filename:        
        update(li, position, path, "foo")
    elif "bar" in filename:
        update(li, position, path, "bar")

print li
这段代码的核心是一个帮助函数parse_name,它从文件名中提取位置和图像类型信息种类

为了按照你想要的方式组织这些信息,我把它们放进了一个目录。然后,我们对外部dict的键进行排序,以创建所需的dict列表。我们使用数字排序,这样11就不会在2之前排序,以此类推

输出

实际上,我们不需要那个sort key函数,因为pos已经在parse_name中转换为int。哎呀所以我们可以这样做:

files_list = [files_dict[k] for k in sorted(files_dict.keys())]
for循环可压缩为:

for s in data:
    kind, pos = parse_name(s)
    files_dict.setdefault(pos, {'position': pos})[kind] = s
虽然这比以前的版本更神秘

files_dict.setdefault(pos, {'position': pos})
使用密钥pos获取文件中的sub dict。如果它不存在,则使用“position”的初始键值对pos创建它


然后,我们用类型s更新子目录,其中s是当前文件的完整文件名。

使用[{}]*9是什么意思?这将导致列表中包含9个对同一条格言的引用。@tobias__k我的错误。您使用[{}]*9是什么意思?这将导致列表包含9个对同一条格言的引用。@tobias__k我的错误。我刚刚意识到我不需要为排序指定键函数。它不会伤害任何东西,只是效率稍微低一点。请看我的最新答案。很抱歉。我刚刚意识到我不需要为排序指定键函数。它不会伤害任何东西,只是效率稍微低一点。请看我的最新答案。很抱歉。
import os, re
cwd = os.getcwd()
print cwd


def update(li, pos, path, key):
    added = False
    if len(li) == 0:
        di=dict()
        di["position"] = int(pos)
        di[key] = path
        li.append(di)
        added = True        
    else:
        for di in li:
            if di["position"]==pos:                
                di[key] = path
                added = True


if not added:
    di=dict()
    di["position"] = int(pos)
    di[key] = path
    li.append(di)    



li = []
for filename in os.listdir(cwd+r'/try'):        # folder name where my files are.
    position = int(re.search('[0-9]+', filename).group())
    print filename, position
    path = cwd + '/' + filename
    if "foo" in filename:        
        update(li, position, path, "foo")
    elif "bar" in filename:
        update(li, position, path, "bar")

print li