2015-10-01 49 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'以循環到143.您需要'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

相關問題