Python:将文件移动到新创建的目录

时间:2016-08-31 21:16:10

标签: python filesystems shutil

我的脚本创建了一堆文件(大小因输入而异)我想根据文件名确定某些文件夹中的某些文件。

到目前为止,我已经得到以下内容但是虽然目录正在创建,但没有文件被移动,我不确定最终for循环中的逻辑是否有意义。

在下面的代码中,我试图将以_01结尾的所有.png文件移动到sub_frame_0文件夹中。

另外,它们可以将文件结尾_01增加到_02等,以及destn文件夹即。从sub_frame_0到sub_frame_1到sub_frame_2等等。

for index, i in enumerate(range(num_sub_frames+10)):
    path = os.makedirs('./sub_frame_{}'.format(index))

# Slice layers into sub-frames and add to appropriate directory

list_of_files = glob.glob('*.tif')
for fname in list_of_files: 
    image_slicer.slice(fname, num_sub_frames) # Slices the .tif frames into .png sub-frames

list_of_sub_frames = glob.glob('*.png')
for i in list_of_sub_frames:
    if i == '*_01.png':
        shutil.move(os.path.join(os.getcwd(), '*_01.png'), './sub_frame_0/')

3 个答案:

答案 0 :(得分:2)

正如你所说,最终循环的逻辑没有意义。

if i == '*_01.ng'

它会评估类似'image_01.png' == '*_01.png'的内容并且始终为false。

Regexp应该是要走的路,但对于这个简单的情况,你可以从文件名中分割数字。

for i in list_of_sub_frames:
    frame = int(i[-6:-4]) - 1
    shutil.move(os.path.join(os.getcwd(), i), './sub_frame_{}/'.format(frame))

如果i = 'image_01.png'然后i[-6:-4]将采用'01',请将其转换为整数,然后只减1以跟随您的架构。

答案 1 :(得分:1)

一个简单的解决方法是检查'* _01.png'是否在文件名i中,并将shutil.move更改为包含i文件名。 (值得一提的是i不是文件路径的好名称

list_of_sub_frames = glob.glob('*.png')
for i in list_of_sub_frames:
    if '*_01.png' in i:
    shutil.move(os.path.join(os.getcwd(), i), './sub_frame_0/')
  

另外[有某种方式]增加文件结尾_01到_02等,以及destn文件夹即。从sub_frame_0到sub_frame_1到sub_frame_2等等。

您可以创建文件名,这样做就像这样简单:

for i in range(10):
    #simple string parsing
    file_name = 'sub_frame_'+str(i)
    folder_name = 'folder_sub_frame_'+str(i)

答案 2 :(得分:1)

这是使用正则表达式的完整示例。这也实现了文件名/目标文件夹的递增

import os
import glob
import shutil
import re

num_sub_frames = 3
# No need to enumerate range list without start or step
for index in range(num_sub_frames+10):
    path = os.makedirs('./sub_frame_{0:02}'.format(index))

# Slice layers into sub-frames and add to appropriate directory

list_of_files = glob.glob('*.tif')
for fname in list_of_files:
    image_slicer.slice(fname, num_sub_frames) # Slices the .tif frames into .png sub-frames

list_of_sub_frames = glob.glob('*.png')
for name in list_of_sub_frames:
    m = re.search('(?P<fname>.+?)_(?P<num>\d+).png', name)
    if m:
        num = int(m.group('num'))+1
        newname = '{0}_{1:02}.png'.format(m.group('fname'), num)
        newpath = os.path.join('./sub_frame_{0:02}/'.format(num), newname)
        print m.group() + ' -> ' + newpath
        shutil.move(os.path.join(os.getcwd(), m.group()), newpath)