Python 为文件夹中的文件生成口述元素列表
我正在制作一个脚本,列出目录中的现有文件,然后将它们保存到字典列表中。在目录中有两种类型的图像,foo和bar,它们在名称的末尾有一个标识符,用于知道应该查看它们的位置,例如: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_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