我正在制作一个脚本,列出目录中的现有文件,然后将它们保存到字典列表中。目录中有两种类型的图像,“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/