2015-10-01 4 views
1

Я пытаюсь организовать некоторые данные перед его обработкой.Организация и копирование файлов в новые папки

У меня есть папка с сырыми файлами tiff (они являются растровыми полосами от беспилотного датчика). Example of file structure

Я хочу переместить эти файлы в новые отдельные папки. например IMG_001_1, IMG_001_2, IMG_001_3, IMG_001_4 и IMG_001_5, все перемещены в новую папку под названием IMG_001. Я согласен с изменением структуры имен файлов, чтобы сделать код более простым.

Дополнительная проблема заключается в том, что в папке отсутствует несколько изображений. Текущие файлы: IMG0016 - IMG0054 (нет IMG0055), IMG0056 - IMG0086 (нет IMG0087) и IMG0087 - IMG0161. Вот почему я думаю, что было бы проще просто переименовать новые папки изображений с 1-143.

Моя основная проблема заключается в перемещении файлов в новые папки - создание папок довольно просто.

+1

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

+0

Что вы можете сделать, это захватить все файлы, соответствующие «IMG» + «1», а затем переместить его в это место (IMG1), а затем увеличить «1» до 123. Вам понадобится 're.match', 'shutil.move()' – Leb

+0

Остин: некоторые примеры имен файлов IMG_0016_1.tif, IMG_0016_2.tif, ... IMG_0018_1.tif, ... – Josh

ответ

0

Проблема решена!

import os 
import shutil 

srcpath = "C:\Users\joshuarb\Desktop\Python_Test\UnorganizedImages" 
srcfiles = os.listdir(srcpath) 

destpath = "C:\Users\joshuarb\Desktop\Python_Test\OrganizedImages" 

# extract the three letters from filenames and filter out duplicates 
destdirs = list(set([filename[0:8] for filename in srcfiles])) 


def create(dirname, destpath): 
    full_path = os.path.join(destpath, dirname) 
    os.mkdir(full_path) 
    return full_path 

def move(filename, dirpath): 
    shutil.move(os.path.join(srcpath, filename) 
      ,dirpath) 

# create destination directories and store their names along with full paths 
targets = [ 
    (folder, create(folder, destpath)) for folder in destdirs 
] 

for dirname, full_path in targets: 
    for filename in srcfiles: 
     if dirname == filename[0:8]: 
      move(filename, full_path) 
1

игры вокруг немного, и этот сценарий вышел, который должен делать то, что вы хотите:

import os 
import shutil 
import re 

UNORG = "C:\\Users\joshuarb\Desktop\Unorganized_Images\\" 
ORG = "C:\\Users\joshuarb\Desktop\Organized_Images\\" 


def main(): 
    file_names = [os.path.join(UNORG, i) for i in get_files_of(UNORG)] 
    for count in range(0, 143): 
     current_dir = "{}IMG_{:04d}".format(ORG, count) 
     os.makedirs(current_dir) 
     move_files = get_files_to_move(file_names, count) 
     print move_files 
     for i in move_files: 
      shutil.move(i, os.path.join(current_dir, os.path.basename(i))) 


def get_files_to_move(file_names, count): 
    return [i for i in file_names if re.match('.*IMG{}_.*'.format(count), i)] 


def get_files_of(mypath): 
    (dirpath, dirnames, filenames) = os.walk(mypath).next() 
    return filenames 


if __name__ == '__main__': 
    main() 

Как вы видите, код не комментируется. Но не стесняйтесь спрашивать, если что-то неясно;)

+0

Спасибо за помощь, но я все еще получаю ошибки при запуске кода. Я включил обновленный код в исходное сообщение, а также сообщения об ошибках. Я также изменил схему именования, чтобы упростить: IMG_0001 через IMG_0143 (еще 143 папки). – Josh

+0

Просто понял, что изменение схемы именования файлов будет бесполезно с вашим кодом .. любые идеи? – Josh

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