python - 为文件夹中的文件生成字典元素列表

标签 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'},
          {'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}]

我的代码中缺少什么?有最好的 pythonic 方法来做到这一点吗?

提前致谢。

最佳答案

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

这段代码的核心是一个辅助函数parse_name,它从文件名。

为了按照您想要的方式组织该信息,我将其放入一个字典中。然后我们对外部字典的键进行排序以创建所需的字典列表。我们使用数字排序,这样 11 就不会排在 2 之前,等等。

import os.path
from pprint import pprint

data = '''\
/img/foo_1.jpg
/img/foo_2.jpg
/img/foo_5.jpg
/img/bar_1.jpg
/img/bar_2.jpg
/img/bar_3.jpg
'''.splitlines()

def parse_name(s):
    fname = os.path.basename(s)
    fbase, _ = os.path.splitext(fname)
    kind, pos = fbase.split('_')
    return kind, int(pos)

files_dict = {} 
for s in data:
    kind, pos = parse_name(s)
    d = files_dict.setdefault(pos, {'position': pos})
    d[kind] = s

pprint(files_dict)
print()

files_list = [files_dict[k] for k in sorted(files_dict.keys(), key=int)]
pprint(files_list)

输出

{1: {'bar': '/img/bar_1.jpg', 'foo': '/img/foo_1.jpg', 'position': 1},
 2: {'bar': '/img/bar_2.jpg', 'foo': '/img/foo_2.jpg', 'position': 2},
 3: {'bar': '/img/bar_3.jpg', 'position': 3},
 5: {'foo': '/img/foo_5.jpg', 'position': 5}}

[{'bar': '/img/bar_1.jpg', 'foo': '/img/foo_1.jpg', 'position': 1},
 {'bar': '/img/bar_2.jpg', 'foo': '/img/foo_2.jpg', 'position': 2},
 {'bar': '/img/bar_3.jpg', 'position': 3},
 {'foo': '/img/foo_5.jpg', 'position': 5}]

实际上,我们不需要排序键函数,因为 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 键获取 files_dict 中的子字典。如果不存在,则使用 ('position', pos) 的初始键值对创建它。

然后我们使用 (kind, s) 更新该子字典,其中 s 是当前文件的完整文件名。

关于python - 为文件夹中的文件生成字典元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42977235/

相关文章:

python - 如何将带有锯齿状数组的字典列表转换为 DataFrame

python - gitPython 克隆 GitCommandError

c# - 如何序列化 List<T>?

python - python中的数组过滤器?

python - 确定推文集中的正/负词比例

python - 如何获取 Texinfo Info 格式的 Python 文档?

python - 创建一个包含五个数字的列表

sql-server - 将keras模型保存到数据库

unicode - 在 Python 3 中运行时更改 stdin/stdout 的编码

python-3.x - 输出文件为空,在Docker容器中的ubuntu16.04中未进行任何编码(检查-ss/-t/-frames参数(如果使用))