Python 如何将已筛选的重复文件列表与其对应的路径连接起来?
我创建了一个Python 如何将已筛选的重复文件列表与其对应的路径连接起来?,python,list,scripting,Python,List,Scripting,我创建了一个脚本来检查我的存储库中以.js扩展名结尾的所有文件。然后,它将文件从其路径&中分离出来,只返回重复的文件 这工作正常,但我想将返回的重复文件列表与其各自的路径连接起来。为简单起见,我只包含了一个列表,表示我项目中的所有文件: // a list representing all my project files ending with .js extension filePaths = [ 'integration/appointment/user-daily.js', '
脚本
来检查我的存储库中以.js
扩展名结尾的所有文件。然后,它将文件从其路径
&中分离出来,只返回重复的文件
这工作正常,但我想将返回的重复文件列表
与其各自的路径
连接起来。为简单起见,我只包含了一个列表
,表示我项目中的所有文件:
// a list representing all my project files ending with .js extension
filePaths = [
'integration/appointment/user-daily.js',
'integration/scheduler/user-daily.js',
'integration/time-off-types/time-off-types.js',
'integration/billing-types/billing-cycle.js',
'integration/accounting/client-yearly.js',
'integration/exports/client-weekly.js',
'integration/user-schedule/client-weekly.js',
]
fileNames = []
for i in range(len(filePaths)):
fileNames.append((filePaths[i].split('/'))[-1])
duplicatedFiles = filter(lambda rec : fileNames.count(rec) >1 ,fileNames)
print(duplicatedFiles)
这是我得到的当前输出
:
['user-daily.js', 'user-daily.js', 'client-weekly.js', 'client-weekly.js']
但我需要获取它们的完整路径
:
['integration/appointment/user-daily.js', 'integration/appointment/user-daily.js', 'integration/user-schedule/client-weekly.js', 'integration/user-schedule/client-weekly.js']
我已尝试加入他们的路径
,但无法使其正常工作 这就是你要找的吗
从集合导入defaultdict
filename\u to\u path=defaultdict(列表)
对于文件路径中的文件路径:
key=filePath.split('/')[-1]
文件名\u到\u路径[key]。追加(文件路径)
重复项=[]
对于文件名为\u到\u路径的文件。值()
如果len(文件)>1:
重复。扩展(文件)
打印(副本)
输出:
['integration/appointment/user-daily.js', 'integration/scheduler/user-daily.js', 'integration/exports/client-weekly.js', 'integration/user-schedule/client-weekly.js']
您可以使用dict首先跟踪文件名,如下所示
filePaths = [
"integration/appointment/user-daily.js",
"integration/scheduler/user-daily.js",
"integration/time-off-types/time-off-types.js",
"integration/billing-types/billing-cycle.js",
"integration/accounting/client-yearly.js",
"integration/exports/client-weekly.js",
"integration/user-schedule/client-weekly.js",
]
fileNames = {}
for fp in filePaths:
name = (fp.split("/"))[-1]
fileNames[name] = fileNames[name] + 1 if name in fileNames else 1
duplicatedFiles = list(filter(lambda x: fileNames[x.split("/")[-1]] > 1, filePaths))
print(duplicatedFiles)
如果我理解正确:
>>> import os
>>> from collections import Counter
>>> basenames = {full: os.path.split(full)[1] for full in filePaths}
>>> counts = Counter(basenames.values())
>>> [full for full, base in basenames.items() if counts[base] > 1]
['integration/appointment/user-daily.js', 'integration/scheduler/user-daily.js', 'integration/exports/client-weekly.js', 'integration/user-schedule/client-weekly.js']
请与您期望的结果进行比较,我认为这是错误的。可能只有我一个人,但我发现这个问题非常令人困惑。您说您将文件从其路径拆分,现在您想再次将其与路径合并?那么为什么一开始就要分开呢?你能再次检查一下你的预期结果吗?它们都有相同的路径。这是你想要的吗?thanks@timgeb是的,我同意这可能会让人困惑。。。我必须将文件与其路径分开,因为它们的路径可能不同,但我只想检查项目中是否有同名的重复文件,而不管路径如何。如果我在执行检查之前保留路径,我将永远不会获得那些重复的文件。因此,问题是如何在filePath
中获取basename多次存在的字符串?@timgeb我试图实现的是获取项目中所有重复的名称文件,而不管它们的路径如何。更清楚吗?也许我的方法是不正确的,但基本上这就是为什么我要努力实现!这正是我一直在寻找的!非常感谢你!你能给我解释一下密码吗?当然。创建从文件名到以文件名结尾的路径列表的映射。然后,遍历映射以查找重复项。如果每个值有超过1个文件路径,则它们是重复的。希望这有帮助。