2015-10-01 46 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

相关问题