Python 在分类字典时有些麻烦
我在不同的文件夹中有相同名称的相同文件。 我想查找最新修改的,因此我使用以下脚本:Python 在分类字典时有些麻烦,python,sorting,collections,Python,Sorting,Collections,我在不同的文件夹中有相同名称的相同文件。 我想查找最新修改的,因此我使用以下脚本: import os from collections import OrderedDict home = os.path.expanduser('~/') # path of home, common for al users result = [] time = {} name = '.webpyconfig.ini' for root, dirs, files in os.walk(home):
import os
from collections import OrderedDict
home = os.path.expanduser('~/') # path of home, common for al users
result = []
time = {}
name = '.webpyconfig.ini'
for root, dirs, files in os.walk(home):
dirs[:] = [d for d in dirs if not d == '.Trash']
if name in files:
result.append(os.path.join(root, name))
for times in range(0, len(result)):
time[times] = [result[times], os.stat(result[times]).st_mtime]
time = OrderedDict(sorted(time.items(), key=lambda x: x[1]))
maxtime = time[len(time) - 1][1]
maxpath = time[len(time) - 1][0]
for k in range(0, len(time)):
print time[k][1], time[k][0]
print ''
print maxtime, maxpath
结果是:
1448636799.0 /Users/Leo/Desktop/Webpy/.webpyconfig.ini
1448637069.0 /Users/Leo/Desktop/Webpy2/.webpyconfig.ini
1448636937.0 /Users/Leo/Documents/Webpy/.webpyconfig.ini
1448636937.0 /Users/Leo/Documents/Webpy/.webpyconfig.ini
如您所见,顺序不正确,因为Webpy2是最新创建的文件。
一些提示?您正在将列表存储为值,并按该列表排序:
time[times] = [result[times], os.stat(result[times]).st_mtime]
排序键中的x[1]
是整个列表,包含[路径、时间]
值。这意味着您首先要按路径排序,而不是按修改时间排序
你有点过分复杂了;只需在os.walk()
循环中添加时间,只需时间:
results = {}
for root, dirs, files in os.walk(home):
dirs[:] = [d for d in dirs if not d == '.Trash']
if name in files:
path = os.path.join(root, name)
results[path] = os.stat(path).m_time
sorted_by_mtime = OrderedDict(sorted(results.items(), key=lambda kv: kv[1]))
for path, time in sorted_by_mtime.items():
print time, path
为什么每次迭代都要对时间进行排序?最后一个问题:如何仅选择最后一个修改路径?使用“for path,time in sorted…”我打印所有可能的内容,但我只想要最新的。然后不要使用排序。您可以使用相同的键使用
max()
,或者如果您发现了一条比您目前看到的路径更新的路径(存储一条路径及其mtime并根据该mtime测试新路径),则只需在os.walk()
循环中进行测试。我发现了这一点。我删除路径并写入if循环'code'result[root]=os.stat(root).st_mtime'code'和for循环外路径w=max(result.iterkeys(),key=lambda key:result[key]),您可以完全删除.iterkeys()
部分。当然!但是max()
在第一个对象上循环,直接在字典上循环已经为您提供了键。所以max(result,key=result.get)
或者在这里就足够了。:-)