Перемещение определенных файлов в подкаталогах в каталог - python - PullRequest
5 голосов
/ 16 ноября 2011

Я довольно плохо знаком с python, но я пытался изучить основы, чтобы помочь в моих исследованиях в области геологии.

В любом случае у меня есть несколько файлов, которые, как только я извлек их из zip-файлов (кстати, мучительно медленный процесс), создают несколько сотен подкаталогов с 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'

Ответы [ 4 ]

7 голосов
/ 16 ноября 2011

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

Я предлагаю следующее (украдено у Мистера Бизли ):

# 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 голосов
/ 16 ноября 2011

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

Есть еще несколько вещей, которые следует учитывать:

  • Вы получили неправильный порядок элементов в каждом кортеже из os.walk, я боюсь - проверьте документацию для этой функции .
  • Предполагая, что вы это исправили, имейте в виду, что вам нужно перебрать files, и вам нужно os.join каждый из них до root, а не src
  • .Надеюсь, вышеприведенное было бы очевидным, если вы распечатаете значения, возвращаемые os.walk, и закомментируете остальную часть кода в этом цикле.
  • С кодом, который выполняет потенциально разрушительные операции, такие как перемещение файлов, я бы всегдасначала попробуйте какой-нибудь код, который просто выводит параметры на shutil.move, пока вы не убедитесь, что он прав.
2 голосов
/ 16 ноября 2011

Я думаю, что вы перепутали способ, которым вы должны использовать 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 голос
/ 16 ноября 2011

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

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