2014-02-15 7 views
4

Я очень новичок в Python, но я думал, что было бы интересно сделать программу для сортировки всех моих загрузок, но у меня с ней немного проблемы. Он отлично работает, если у моего адресата есть только одно слово, но если у адресата есть два слова или более, это происходит неправильно, и программа застревает в цикле. Есть ли у кого-нибудь идея сравнить списки, чем я?Python Сравнение двух списков строк для сходства

>>>for i in dstdir: 
>>> print i.split() 

['CALIFORNICATION'] 
['THAT', "'70S", 'SHOW'] 
['THE', 'BIG', 'BANG', 'THEORY'] 
['THE', 'OFFICE'] 
['DEXTER'] 
['SPAWN'] 
['SCRUBS'] 
['BETTER', 'OF', 'TED'] 

>>>for i in dstdir: 
>>> print i.split() 
['Brooklyn.Nine-Nine.S01E16.REAL.HDTV.x264-EXCELLENCE.mp4'] 
['Revolution', '2012', 'S02E12', 'HDTV', 'x264-LOL[ettv]']] 
['Inequality', 'for', 'All', '(2013)', '[1080p]'] 

Это пример вывода списков.

У меня есть целевой каталог с только папками в нем и каталогом загрузки. Я хочу, чтобы программа автоматически просматривала имя исходного файла, а затем просматривала имя получателя. если имя получателя находится в имени источника, тогда у меня есть да, чтобы продолжить и скопировать загруженный файл, чтобы он был отсортирован в моей коллекции.

destination = '/media/mediacenter/SAMSUNG/SERIES/' 
source = '/home/mediacenter/Downloads/' 
dstdir = os.listdir(destination) 
srcdir = os.listdir(source) 

for i in srcdir: 
    source = list(i.split()) 
    for j in dstdir: 
     count = 0 
     succes = 0 
     destination = list(j.split()) 
     if len(destination) == 1: 
      while (count < len(source)): 
       if destination[0].upper() == source[count].upper(): 
        print 'succes ', destination, ' ', source 
       count = count + 1 
     elif len(destination) == 2: 
      while(count < len(source)): 
       if (destination[0].upper() == source[count].upper()): 
        succes = succes + 1 
        count = len(source) 
      count = 0 
      while(count < len(source)): 
       if (destination[1].upper() == source[count].upper()): 
        succes = succes + 1 
        count = len(source) 
      count = 0 
      if succes == 2: 
       print 'succes ', destination, ' ', source 

На данный момент я доволен только «успехом» в качестве выхода; Я выясню, как копировать файлы, так как для меня будет совсем другая проблема в ближайшем будущем.

+3

Вы должны объяснить, что вы пытаетесь сделать, возможно, с примером того, что вы получаете от своей программы и чего вы ожидаете получить. – hivert

ответ

1

Что-то вроде этого, может быть. Проверяет, является ли каждое слово в папке назначения существует в имени файла

dstdir = ['The Big Bang Theory', 'Dexter', 'Spawn' ] 

srcdir = ['the.big.bang.theory s1e1', 'the.big.bang.theory s1e2', 'dexter s2e01'] 

for source in srcdir: 
    for destination in dstdir: 
     destinationWords = destination.split() 

     if all(word.lower() in source.lower() for word in destinationWords): 
      print 'succes ', destination, ' ', source 

выходы:

succes The Big Bang Theory the.big.bang.theory s1e1 
succes The Big Bang Theory the.big.bang.theory s1e2 
succes Dexter dexter s2e01 
+0

Ничего себе милый! простой код даже если понятно. Долгое время с открытым исходным кодом и пользователями сообщества, но в первый раз я задал вопрос сообществу, и результаты были потрясающими. спасибо также этот код работает отлично –

0

С помощью этого простого скрипта мотивационного приведенного ниже, вы перемещаете файлы из источника к судьбе.

src = "/home/mediacenter/Downloads" 
dst = "/media/mediacenter/SAMSUNG/SERIES" 
source = os.listdir(src) 
destination = os.listdir(dst) 

for filename in source: 

    file_src = src +"/"+ str(filename) 
    file_dst = dst +"/"+ str(filename) 

    if filename not in destination and os.path.isdir(file_src) is False: 
     #download file 
     os.system("mv %s %s" %(file_src, file_dst)) 
    elif filename not in destination and os.path.isdir(file_src) is True: 
     #download directory 
     os.system("mv %s %s" %(file_src, dst)) 

Кажется, что вы ищите. Вам просто нужно проверить, не указано ли имя файла в списке адресатов и переместить его. Это сработало для вас?

+0

Я думаю, проблема заключалась в том, чтобы сопоставлять имена файлов с папками, где нет точного соответствия. Например, чтобы сопоставить загруженное имя файла, например 'name.of.series.episode # .format', против имени файла 'fold'. И нейтральный метод для перемещения файлов может быть лучше. – M4rtini

+0

Протестировано с .txt, .jpeg, .mp4, папками, .pdf ... расширениями и без проблем. Оно работает! – Jack

+1

Я не вижу, где вы убедитесь, что файлы с именами типа 'The.Big.Bang.Theory. ***' из исходных совпадений в папке «Большая ошибка» в месте назначения. Но это даже не то, чего хотел OP. Трудно узнать, когда он не встает, чтобы ответить на вопросы. – M4rtini

0

Из предыдущего найденного ответа re.sub Возможный путь к решению проблемы. Подставим этот блок:

# ... 
import re 

source = os.listdir(src) 
destination = os.listdir(dst) 

По

source = [re.sub(' ', '\\\\ ',w)for w in os.listdir(src)] 
destination = [re.sub(' ', '\\\\ ', w) for w in os.listdir(dst)] 

Это делает трюк, чтобы переместить папки с пробелами между именами.

Вместо того, чтобы сравнивать строки для обработки специальных персонажей, я думаю, вы должны искать regular expressions. Я пытался использовать что-то вроде этого (применительно к источнику и месту назначения), но не стал.

#snippet of code doesnt work, just to illustrate 

pattern = "[a-zA-Z0-9]" 
for i,w in enumerate(source): 
    for ch in w: 

     if not re.match(pattern, ch) : 
      print source , ch 

      source[i] = re.sub(ch,r"\\" + ch, source[i]) 

В этом link вопрос с simmilar беспокойством.

2

Мой личный фаворит для сравнения нечетких строк в python: fuzzywuzzy В нем есть несколько хороших примеров и очень либеральная лицензия.

Некоторые примеры, которые могут иметь отношение к вам:

> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"] 
> process.extract("new york jets", choices, limit=2) 
    [('New York Jets', 100), ('New York Giants', 78)] 
> process.extractOne("cowboys", choices) 
    ("Dallas Cowboys", 90) 

Или token_sort_ratio для неупорядоченных потребностей.

> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 
    90 
> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 
    100