2015-06-28 3 views
1

Я пытаюсь перечислить все файлы с похожим именем в отдельную папку, но не могу определить имена для их перемещения. Ниже я создаю папку с Duplicate name в моем рабочем каталоге, а затем передаю все файлы через функцию split, чтобы получить среднюю часть имени от строки xmlName = xml.split('.')[1]. Теперь xmlName имеет только часть имени файла, которая помогает мне решить дублирующее имя.Список дубликатов файлов из списка в Python

Ниже приведен список файлов в рабочем каталоге:

# ls 
CRON.JC_ADA_SOURCE_DLOAD.xml   Duplicate         TERA.SC_CACHE_PURGE_01.xml 
CRON.JC_ADA_SOURCE_WLOAD.xml   POWE.BI_RUN_INFO_WKFLW_INF1.xml test.py 
CRON.SC_ADA_CLEANUP_SCRIPT.xml   POWE.JC_ADA_SOURCE_DLOAD.xml   Unknown 
CRON.SC_CACHE_PURGE_01.xml    POWE.SC_CHECK_ADA_DATA_FILE_INF2.xml 
# 

Ниже приведен код (где я не уверен, как только список вниз дубликатов файлов).

#!/usr/bin/python 

import os, sys 

Working_Dir = "/home/export/Partition/JobDefinition" 

if not os.path.exists('./Duplicate'): 
    os.makedirs('./Duplicate', 0755) 

for path, dir, files in os.walk(Working_Dir): 
    for xml in files: 
     xmlName = xml.split('.')[1] 
     if xmlName == xmlName: 
      print xmlName 

Выход:

# python test.py 
SC_ADA_CLEANUP_SCRIPT 
SC_CHECK_ADA_DATA_FILE_INF2 
JC_ADA_SOURCE_WLOAD 
BI_RUN_INFO_WKFLW_INF1 
JC_ADA_SOURCE_DLOAD 
SC_CACHE_PURGE_01 
JC_ADA_SOURCE_DLOAD 
SC_CACHE_PURGE_01 
py 
# 

Какой выход мне нужно ниже имен, так что я могу переместить соответствующий файл Дублирование папку:

JC_ADA_SOURCE_DLOAD 
SC_CACHE_PURGE_01 

ответ

0

Если вы хотите только дубликаты, вы можете хранить имена, когда вы их найдете в чем-то (набор будет наиболее уместным, но список будет делать); если что-то, что вы собираетесь вставить, уже есть, это дубликат.

+0

Спасибо за руководство Скоттом. Я очень новичок в Python и поэтому не уверен, как использовать set, но теперь, поскольку я знаю, что набор должен использоваться, я найду его использование. – ankitpandey

1

Ленивый Ответ

collections.Counter будет делать то, что вы хотите, с помощью магии.

import collections 

c = collections.Counter([]) 

for path, dir, files in os.walk(Working_Dir): 
    c += collections.Counter([xml.split('.')[1] for xml in files]) 

Несколько менее Ленивый Ответ

Следите за каждый уникальный файл с set

seen = set() 
duplicates = set() 
for path, dir, files in os.walk(Working_Dir): 
    for xml in files: 
     xmlName = xml.split('.')[1] 
     if xmlName in seen: 
      duplicates.add(xmlName) 
     seen.add(xmlName) 
+0

Спасибо за предоставление кода.Я пытался пойти с менее Lazy Answer, но ниже ошибка. Я действительно очень новичок в Python. seen.add (xmlName) AttributeError: объект 'dict' не имеет атрибута 'add' – ankitpandey

+0

Спасибо за изменение. Я попытался напечатать переменную duplicates, а ниже - вывод: как переместить только эти два файла в Duplicate folder? '# Python test.py набора ([]) множества ([]) множества ([]) множества ([]) множества ([]) множества ([]) множества ([ 'JC_ADA_SOURCE_DLOAD' ]) set (['SC_CACHE_PURGE_01', 'JC_ADA_SOURCE_DLOAD']) set (['SC_CACHE_PURGE_01', 'JC_ADA_SOURCE_DLOAD']) ' – ankitpandey

0

Если вы пытаетесь найти повторяющиеся элементы в списке и создать другой список только для этих дублирующих элементов вот как это можно сделать:

У меня есть список a с двумя дублирующими элементами в нем 2 и 3. Я нахожу эти элементы в list a и создаю другой список b, который будет содержать только те два элемента.

import collections 
a = [1,2,3,4,5,6,2,3,] 
b = [item for item, count in collections.Counter(a).items() if count > 1] 

При печати b выход:

[2, 3] 

Затем, позже, если вы хотите, чтобы удалить повторяющиеся элементы из a, вы можете использовать set сделать это следующим образом:

a = set([1,2,3,4,5,6,2,3,]) 

Теперь, когда вы печатаете a, выходной сигнал:

set([1, 2, 3, 4, 5, 6]) 
Смежные вопросы