【问题标题】:Compare directories on file names比较文件名上的目录
【发布时间】:2015-05-21 13:13:39
【问题描述】:

我需要比较两个目录A和B的文件名。

A 包含的文件比 B 多(分别约为 15000/20000),具有相同名称/不同内容。

我有:

目录: 'doctor_Weiss.csv', 'doctor_Urlici.csv', 'doctor_Basler J. Rudolph.csv'

目录: 'doctor_Weiss.csv', 'doctor_Urlici.csv'

我需要 dirA-dirB 中的所有文件(来自 dirA):

diffAB: 'doctor_Basler J. Rudolph.csv'

我试过了:

import os
from os.path import join

fpA = {}
for root, dirs, files in os.walk('C:\A\docs'):
    for name in files:
        fpA[name] = 1
fpB = {}
for root, dirs, files in os.walk('C:\B\docs'):
    for name in files:
        fpB[name] = 1

 a = []
 for name in fpA.keys():
     if not(name in fpB.keys()):
         a.append(name)

没用。 'a' 包含来自 B 的所有文件,而不仅仅是 A-B。

我还尝试遍历两个目录并创建文件集,但也没有工作(同样是 B 中的所有文件)。

感谢您的帮助

【问题讨论】:

  • 在最后一个 for 循环中,您编写了 fpa.keys() 而不是 fpA.keys() 和 fpb.keys() 而不是 fpB.keys()。这只是一个错字吗?
  • 谢谢,你是对的。刚刚编辑了我的帖子
  • 我认为您不应该在此处编辑问题。。稍后引用它的用户会感到困惑。
  • 对不起,我认为这很有帮助
  • 当然..没问题

标签: python directory compare filenames


【解决方案1】:

您可以通过这种方式使用set来获取文件的差异。

import os
from os.path import isfile
list_A = [x for x in os.listdir(dirA) if isfile(x)]
list_B = [x for x in os.listdir(dirB) if isfile(x)]
diff = set(list_A) - set(list_B)

【讨论】:

  • 它的工作方式略有不同:list_A = [x for x in os.listdir(dirA)] 和 list_B = [x for x in os.listdir(dirB)]。出于某种原因,如果我添加了 isfile(x) len(list_A)=0 和 len(list_B)=0。非常感谢
【解决方案2】:

在最后一个 for 循环中,您编写了 fpa.keys() 而不是 fpA.keys() 和 fpb.keys() 而不是 fpB.keys()。使用适当的变量名称,它将起作用。它对我有用。

【讨论】:

    【解决方案3】:

    这个怎么样?

    >>> from os import listdir
    >>> set(listdir(dirA)).difference(listdir(dirB))
    

    os.listdir获取当前目录下的所有文件,然后使用set.difference()获取dirA中的差异而不是dirB中的差异。

    【讨论】:

    • 谢谢,由于某种原因,区别只是空集
    【解决方案4】:

    您需要转义路径名中的反斜杠!并且 - 按照建议 - 将 fpa 重命名为 fpA 和 fpb 重命名为 fpB。然后你的例子就可以了。

    import os
    from os.path import join
    
    fpA = {}
    for root, dirs, files in os.walk('C:\\A\\docs'): # <- escape backslash
        for name in files:
            fpA[name] = 1
    fpB = {}
    for root, dirs, files in os.walk('C:\\B\\docs'): # <- escape backslash
        for name in files:
            fpB[name] = 1
    
    a = []
    for name in fpA.keys():
        if not(name in fpB.keys()):
            a.append(name)
    

    【讨论】:

    • 谢谢,我尝试了您的所有建议,但继续获取所有文件 (B) 而不仅仅是 A-B。还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多