2011-11-16 2 views
4

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

В любом случае у меня есть несколько файлов, которые, как только я извлек из их zip-файлов (мучительно медленный процесс btw), производят несколько сотен подкаталогов с 2-3 файлами в каждом. Теперь я хочу извлечь все эти файлы, заканчивающиеся на «dem.tif», и поместить их в отдельный файл (переместить не копировать).

Возможно, я попытался перейти в глубокий конец, но код, который я написал, запускается без ошибок, поэтому он не должен находить файлы (которые существуют!), Поскольку он дает мне инструкцию else. Вот код, который я создал

import os 

src = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Extracted' # input 
dst = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Analyses' # desired  location 

def move(): 
    for (dirpath, dirs, files) in os.walk(src): 
     if files.endswith('dem.tif'): 
      shutil.move(os.path.join(src,files),dst) 
      print ('Moving ', + files, + ' to ', + dst) 
     else: 
      print 'No Such File Exists' 

Любая помощь была бы очень признательна, и я заранее благодарю вас за ваше время.

С уважением,

Bjorn

ответ

5

Во-первых, добро пожаловать в сообщество и питон! Вы можете изменить свое имя пользователя, особенно если вы часто здесь. :)

Я предлагаю следующее (украдено из Mr. Beazley):

# genfind.py 
# 
# A function that generates files that match a given filename pattern 

import os 
import shutil 
import fnmatch 

def gen_find(filepat,top): 
    for path, dirlist, filelist in os.walk(top): 
     for name in fnmatch.filter(filelist,filepat): 
      yield os.path.join(path,name) 

# Example use 

if __name__ == '__main__': 
    src = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Extracted' # input 
    dst = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Analyses' # desired  location 

    filesToMove = gen_find("*dem.tif",src) 
    for name in filesToMove: 
     shutil.move(name, dst) 
3

Update: спрашивающий прояснил ниже, что он/она на самом деле вызов функции перемещения, который был первым пунктом в моем ответе.

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

  • У вас есть порядок элементов, возвращаемых в каждом кортеже из os.walk неправильно, я боюсь - проверить documentation for that function.
  • Предполагая, что вы исправили, что также иметь в виду, что вам нужно перебрать files, и вы должны os.join каждый из тех root, а не src
  • Выше было бы очевидно, надеюсь, если вы печатаете выведите значения, возвращаемые os.walk, и закомментируйте остальную часть кода в этом цикле.
  • С кодом, который делает потенциально разрушительные операции, такие как перемещение файлов, я всегда бы сначала попробовал код, который только распечатывает параметры до shutil.move, пока вы не убедитесь, что это правильно.
+0

Привет, Марк, спасибо за ваш ответ. Извините, мой английский, вероятно, не самый лучший, что я хотел сказать, это то, что я запускаю программу в окне оболочки, набрав в move(), и все работает нормально без shutil.move, но как только я добавлю его, я получаю следующую ошибку. AttributeError: объект «list» не имеет атрибута «endswith» – BJEBN

+0

@ user1041814: эта ошибка возникает из-за первого и второго пунктов, упомянутых выше - ваши 'файлы' на самом деле список подкаталогов в каждом каталоге в шаге. –

+0

Еще раз спасибо за предложения! Его иногда всегда самые простые ошибки, такие как получение порядка функции os.walk, которая вас достает! – BJEBN

2

Я думаю, вы перепутали способ использования os.walk().

for dirpath, dirs, files in os.walk(src): 
    print dirpath 
    print dirs 
    print files 
    for filename in files: 
     if filename.endswith('dem.tif'): 
      shutil.move(...) 
     else: 
      ... 
1

Любая конкретная причина, вы должны сделать это в Python? Будет ли простая командная оболочка не проще? Если вы используете Unix-подобную систему или имеете доступ к Cygwin в Windows:

find src_dir -name "*dem.tif" -exec mv {} dst_dir 

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

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