我需要比较两个目录A和B的文件名。
A包含的文件多于B(分别约为15000/20000),具有相同的名称/不同的内容。
我有:
dirA: var options = {
width: 400,
height: 240,
colors: ['#e0440e', '#e6693e', '#ec8f6e', '#f3b49f', '#f6c7b6']
};
dirB: NSRegularExpression
我需要dirA-dirB中的所有文件(来自dirA):
diffAB: \p{script=Han}
我试过了:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\p{script=Han}" options:NSRegularExpressionCaseInsensitive error:nil];
if ([regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])] > 0) {
// string contains Chinese characters
}
没用。 'a'包含B中的所有文件,而不仅仅是A-B。
我还试图遍历这两个目录并创建文件集但是也没有工作(再次来自B的所有文件)。
感谢您的帮助
答案 0 :(得分:4)
您可以使用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)
答案 1 :(得分:1)
在最后一个for循环中,您编写了fpa.keys()
而不是fpA.keys()
和fpb.keys()
而不是fpB.keys()
。使用适当的变量名称,它将起作用。它对我有用。
答案 2 :(得分:1)
这个怎么样?
>>> from os import listdir
>>> set(listdir(dirA)).difference(listdir(dirB))
os.listdir
获取当前目录下的所有文件,然后使用set.difference()
来获取dirA的差异,但不是dirB中的差异。
答案 3 :(得分:0)
您需要在路径名中转义反斜杠!并且 - 按照建议 - 将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)