2016-05-18 6 views
0

Итак, у меня есть папка из нескольких тысяч PDF-файлов в/path, и у меня есть список сотен имен под названием names.csv (только один столбец, он так же легко может быть .txt).Выберите файлы в каталоге и переместите их на основе текстового списка имен файлов

Я пытаюсь выбрать (и в идеале, переместить) pdf-файлы, где любое имя из names.csv находится в любом имени файла.

Из моих исследований до сих пор, кажется, listdir и регулярное выражение один подход, по крайней мере, получить список файлов, которые я хочу:

import os, sys 
import re 


for files in os.listdir('path'): 
    with open('names.csv') as names: 
     for name in names: 
      match = re.search(name, files) 

     print match 

Но в настоящее время это не просто возвращается «None» «None» и т. д., полностью вниз.

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

Любые советы очень ценятся!

ответ

1

Проблема в том, что переменная name всегда заканчивается символом новой строки \n. Символ новой строки отсутствует в именах файлов, поэтому regex не находит совпадений.

Есть также несколько других небольших проблем с вашим кодом:

  • Вы открываете файл names.csv в каждой итерации цикла. Было бы более эффективно открывать файл один раз, а затем перебирать все файлы в каталоге.
  • Regex здесь не требуется, и на самом деле это может вызвать проблемы. Если, например, строка в вашем файле csv выглядела как (this isn't a valid regex, тогда ваш код выдавал бы исключение. Это можно было бы зафиксировать на escaping сначала, но регулярное выражение по-прежнему не требуется.
  • Ваш print match находится не в том месте. Так как match перезаписывается на каждой итерации цикла, и вы печатаете его значение после цикла, вы можете увидеть его последнее значение.

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

import os 

# open the file, make a list of all filenames, close the file 
with open('names.csv') as names_file: 
    # use .strip() to remove trailing whitespace and line breaks 
    names= [line.strip() for line in names_file] 

for filename in os.listdir('path'): 
    for name in names: 
     # no need for re.search, just use the "in" operator 
     if name in filename: 
      # move the file 
      os.rename(os.path.join('path', filename), '/path/to/somewhere/else') 
      break 
+0

Спасибо. Да, я думал, «если подстрока в строке» будет работать, но каким-то образом я отклонился от регулярного выражения, довольно нелогично придерживаясь некоторых старых рабочих примеров, которые я лежал. Я буду работать через это, основываясь на ваших предложениях. Спасибо, базильон! – 1rick

+1

Чтобы следить за этим, я получил его для работы на основе вашего комментария. Хотя я все-таки пытался переместить раздел * файла, поэтому я заменил эту строку просто «print filename». Оттуда я использовал совершенно отдельный скрипт для процесса перемещения, используя 'shutil.move (name, destinationfolder)' в цикле for. В любом случае, спасибо за ваше руководство в этом шаге. :) – 1rick

1

Вы говорите, что ваш names.csv это один столбец. Это должно означать, что за каждым именем следует символ новой строки, который также будет включен при сопоставлении. Вы можете попробовать следующее:

match = re.search(name.rstrip(), files) 

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^