首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个文件夹,返回不同文件的完整路径。

比较两个文件夹,返回不同文件的完整路径。
EN

Stack Overflow用户
提问于 2020-06-05 08:19:04
回答 3查看 41关注 0票数 0

我有一个脚本,它应该比较文件夹和子文件夹中的文件。新文件应稍后复制。这是我用来创建列表的函数。

代码语言:javascript
复制
def fullNames(source):
    matches = []

    for root, dirnames, filenames in os.walk(source):
        for filename in filenames:
            if filename.endswith('.xlsx'):
                matches.append(os.path.join(root, filename))
    return matches

此函数返回如下列表:

代码语言:javascript
复制
list1 =  ['C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18\\file1.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18\\file2.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18\\file3.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18\\file4.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18\\file5.xlsx']

list2 =  ['C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17\\file1.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17\\file2.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17\\file3.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17\\file4.xlsx']

要比较这些文件,我必须比较每个文件的基本名称。

代码语言:javascript
复制
list1_short = [os.path.basename(file) for file in list1]
list2_short = [os.path.basename(file) for file in list2]

result = [item for item in list1_short if item not in list2_short]
result

Out[134]: ['file5.xlsx']

这是可行的,但我需要返回该文件的完整路径,而不是basename。有谁知道怎么解决这个问题吗?

这将是预期的结果:

代码语言:javascript
复制
['C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18\\file5.xlsx']
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-05 08:35:58

实际上,你可以摆脱list2_short

代码语言:javascript
复制
list1 =  ['C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18/file1.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18/file2.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18/file3.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18/file4.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-18/file5.xlsx']

list2 =  ['C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17/file1.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17/file2.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17/file3.xlsx',
          'C:/Users/langma/Desktop/EDI/Downloadfolder/EDI_2020-05-17/file4.xlsx']


existing_names = [os.path.basename(item) for item in list2]
missing_files = [item for item in list1 if os.path.basename(item) not in existing_names]
票数 1
EN

Stack Overflow用户

发布于 2020-06-05 08:32:05

你可以通过改变你获得结果的方式来做到这一点,

result = [list1[i] for i in range(len(list1_short)) if list1_short[i] not in list2_short]

票数 1
EN

Stack Overflow用户

发布于 2020-06-05 08:35:55

代码语言:javascript
复制
list1_short = [os.path.basename(file) for file in list1]
list2_short = [os.path.basename(file) for file in list2]
missing_files=[]
for i,item in enumerate(list1_short):
    if item not in list2_short:
        missing_files.append(list1[i])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62211015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档