У меня есть два файла в разных местах, один файл содержит .jpg, а другой файл с. xml. Я хочу сравнить их имена и распечатать разницу - PullRequest
0 голосов
/ 02 мая 2020

Как сравнить файлы в этих двух папках?

Файлы изображений:

1.jpg
2.jpg
5.jpg

XML Файлы:

1.xml
2.xml
3.xml

Вывод:

5.jpg, 3.xml

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Сравните без расширения и найдите другое, используя set.

import os
f1 = os.listdir("foler1/")
f2 = os.listdir("folder2/")
f1 = set(map(lambda x:os.path.splitext(x)[0], f1))
f2 = set(map(lambda x:os.path.splitext(x)[0], f2))
r1 = list(map(lambda x:x+'.jpg', f1-f2))
r2 = list(map(lambda x:x+'.xml', f2-f1))
result = r1 + r2
print(result)
0 голосов
/ 02 мая 2020

Это решение достаточно быстрое. Если бы у вас были огромные каталоги, было бы лучше табличное решение ha sh. Скажем, вы хотите сравнить каталог XML/ и images/.

import os

def dir_diff(dir1, dir2):
  contents1 = sorted(   os.listdir(dir1))
  contents2 = sorted(   os.listdir(dir2))
  heads1=[]
  heads2=[]
  for fname in contents1:
    heads1.append(fname[:fname.rfind('.')] )
  for fname in contents2:
    heads2.append(fname[:fname.rfind('.')] )
  i=j=0
  out=[]
  print(heads2)
  print(heads1)
  while True:
    fname1=heads1[i]
    fname2=heads1[j]
    if   fname1 < fname2:
      out.append(contents1[i])
      i+=1
    elif fname2 < fname1:
      out.append(contents2[j])
      j+=1
    else:
      i+=1
      j+=1
    if i ==len(heads1) and j ==len(heads2):
      return out
    elif i==len(heads1):
      return out+contents2[j:]
    elif j==len(heads2):
      return out+contents1[i:]



if __name__=='__main__':
  folder1 = 'XML/'       # NOTE: change these to the folder names you want
  folder2 = 'images/'    # NOTE: change these to the folder names you want
  for fname in dir_diff(folder1, folder2):
    os.remove(fname)
...